7、JsonCpp简单使用(3)

简介: 1、相关概念总结 (1)解析json的方法 Json::Value json;     //表示一个json格式的对象 Json::Reader reader;  //json解析 reader.parse(json_buf/*json格式的字符串*/,json,false);  //解析出json放到json中     jsoncpp库中的Reader类用来将字串或者流载入解析器。

1、相关概念总结

(1)解析json的方法

Json::Value json;     //表示一个json格式的对象

Json::Reader reader;  //json解析

reader.parse(json_buf/*json格式的字符串*/,json,false);  //解析出json放到json

    jsoncpp库中的Reader类用来将字串或者流载入解析器。后期可以用Reader里面的解析方法把Json字串解码为C++认识的数据。可以用 Json::Reader来声明一个Reader实例。Reader中最常用的就是一个parse方法,该方法用来将载入的json字串解析为C++格式的数据。

(2) 数组访问

Json::Value //格式如下

[["key1":value1],["key2":value2]]

Json::Value::const_iterator iter;  //迭代器

for(iter = input.begin(); iter != input.end(); iter++)

Json::Value::Members member=(*iter).getMemberNames();

*(member.begin());          // 输出 key1,key2

(*iter)[*(member.begin())];     //输出 value1,value2

    Value类是库中的核心类,用于存储各样格式的数据,可以包括int,double,short,char *,string,bool,object,array等几乎所有格式的数据。该库的编码和解码的核心功能都是用Value类实现的。就用以上的 Readerparse方法来说,需要传入一个Value类别的引用值,就是用来存储Json数据的根值,并且可以用这个根值来存取其他的所有值。

(3) 对象访问

直接用 value["key"]即可

(4) 输出json格式串

    调用 Json::FastWriterwriter

    writer是该库的一个虚类,没有真正的实现encode的功能。需要重载里头的方法来实现真正的encode功能。FastWriter是该库中真正实现encode功能的类,用来实现将Value编码称为Json串。Json::StyledWriter 是格式化后的json

    不支持utf-8格式的输出,需要自己调用writer之后,用iconv转化成utf-8字符串

2、示例代码

1)示例代码1

View Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <vector>
#include <iostream>
#include "json/json.h"
using namespace std;

typedef struct piece
{
string letter;
string wild;
}piece;

string encode_msg(string token,int game_id,vector<piece> piece_array)
{
//Json::Value root;
Json::Value var;
//apply “token” and “game_id” value to json struct
var["token"] = token;
var["game_id"] = game_id;

Json::Value pieces;//store all pieces
for (int i=0;i < piece_array.size();i++)
{
Json::Value piece_ex;//here it store just one piece
//next 4 lines to apply piece value to json struct
piece_ex["letter"] = piece_array[i].letter;
piece_ex["wild"] = piece_array[i].wild;
//ok,yes we just have apply One piece ,then push back to the array
pieces.append(piece_ex);
}
var["piece_array"] = pieces;//yes,store pieces in var [Value]
//root.append(var);

Json::FastWriter writer;
return writer.write(var);//generate json string:),here all is done
}
int main()
{
piece one, two;
one.letter = "1";
one.wild = "ont";
two.letter = "2";
two.wild = "two";
vector<piece> myp;
myp.push_back(one);
myp.push_back(two);
string ret = encode_msg("mytoken", 123, myp);
cout << ret << endl;
return 1;
}

 

View Code
{"game_id":123,"piece_array":[{"letter":"1","wild":"ont"},{"letter":"2","wild":"two"}],"token":"mytoken"}

结果显示

可以看到,直接用wirter输出的json为非格式化的数据,而通过root.toStyledString()后,代码就是格式化的。

2)示例3,来源于官网

View Code
// Configuration options
{
// Default encoding for text
"encoding" : "UTF-8",

// Plug-ins loaded at start-up
"plug-ins" : [
"python",
"c++",
"ruby"
],

// Tab indent size
"indent" : { "length" : 3, "use_space": true }
}

 

View Code
Json::Value root;   // will contains the root value after parsing.
Json::Reader reader;
bool parsingSuccessful = reader.parse( config_doc, root );
if ( !parsingSuccessful )
{
// report to the user the failure and their locations in the document.
std::cout << "Failed to parse configuration\n"
<< reader.getFormattedErrorMessages();
return;
}

// Get the value of the member of root named 'encoding', return 'UTF-8' if there is no
// such member.
std::string encoding = root.get("encoding", "UTF-8" ).asString();
// Get the value of the member of root named 'encoding', return a 'null' value if
// there is no such member.
const Json::Value plugins = root["plug-ins"];
for ( int index = 0; index < plugins.size(); ++index ) // Iterates over the sequence elements.
loadPlugIn( plugins[index].asString() );

setIndentLength( root["indent"].get("length", 3).asInt() );
setIndentUseSpace( root["indent"].get("use_space", true).asBool() );

// ...
// At application shutdown to make the new configuration document:
// Since Json::Value has implicit constructor for all value types, it is not
// necessary to explicitly construct the Json::Value object:
root["encoding"] = getCurrentEncoding();
root["indent"]["length"] = getCurrentIndentLength();
root["indent"]["use_space"] = getCurrentIndentUseSpace();

Json::StyledWriter writer;
// Make a new JSON document for the configuration. Preserve original comments.
std::string outputConfig = writer.write( root );

// You can also use streams. This will put the contents of any JSON
// stream at a particular sub-value, if you'd like.
std::cin >> root["subtree"];

// And you can write to a stream, using the StyledWriter automatically.
std::cout << root;

参考

1】 讲解说明

http://hi.baidu.com/%B4%AB%CB%B5%D6%D0%B5%C4%C8%CC%D5%DF%C3%A8/blog/item/a6eb970c98a644d67acbe15a.html

2】 示例,该作者博文不错,涵盖了各个方面

http://hi.baidu.com/s_jqzhang/blog/item/a3c5df1f9408246ff624e4f5.html/cmtid/02e72e4fcb488039aec3ab28

3boost库支持json比较好

http://freedomhui.com/?p=6

3】 对json的类型作了简单的小结,为json-c进行了介绍

http://developer.51cto.com/art/201001/176060.htm

4】 官网

http://jsoncpp.sourceforge.net/index.html

相关的类介绍及使用

http://jsoncpp.sourceforge.net/annotated.html

【5】 其他例子

 http://joysofprogramming.com/json_parser_json-c/

 http://forum.openframeworks.cc/index.php?topic=2833.0

目录
相关文章
|
JSON 开发工具 C++
Windows下用CMake编译JsonCpp及配置(适合新手)
Windows下用CMake编译JsonCpp及配置(适合新手)
1259 0
|
开发框架 前端开发 搜索推荐
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(4) -- 实现DataGrid数据的导入和导出操作
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(4) -- 实现DataGrid数据的导入和导出操作
|
Python
Python中导入错误(ImportError)
【7月更文挑战第14天】
871 11
|
编译器 Linux C语言
C/C++ 常见函数调用约定(__stdcall,__cdecl,__fastcall等):介绍常见函数调用约定的基本概念、用途和作用
C/C++ 常见函数调用约定(__stdcall,__cdecl,__fastcall等):介绍常见函数调用约定的基本概念、用途和作用
879 0
|
存储 Python
数据包络分析(Data Envelopment Analysis, DEA)详解与Python代码示例
数据包络分析(Data Envelopment Analysis, DEA)详解与Python代码示例
|
机器学习/深度学习 人工智能 自然语言处理
深度学习在自然语言处理中的应用与挑战
【7月更文挑战第21天】本文深入探讨了深度学习技术在自然语言处理(NLP)领域的应用及其面临的挑战。文章首先介绍了深度学习的基本概念和关键技术,然后详细分析了深度学习如何推动NLP领域的发展,包括语音识别、文本分类、机器翻译等任务的突破。最后,讨论了深度学习在NLP中遇到的挑战,如数据偏差、模型解释性差等问题,并提出了可能的解决方向。
|
JSON JavaScript 数据格式
【深入探究C++ JSON库】解析JSON元素的层级管理与遍历手段
【深入探究C++ JSON库】解析JSON元素的层级管理与遍历手段
1940 2
|
人工智能 Ubuntu Shell
【Ubuntu工具】安装教程:Ubuntu系统上源码编译安装QT5.15.13(有坑)
【Ubuntu工具】安装教程:Ubuntu系统上源码编译安装QT5.15.13(有坑)
2037 0
|
分布式计算 Hadoop
Iceberg实战踩坑指南(二)
Iceberg实战踩坑指南
338 0
|
Java 网络安全
Java 信任所有SSL证书(解决PKIX path building failed问题)
Java 信任所有SSL证书(解决PKIX path building failed问题)
26894 3