jsoncpp的api简要说明
1 jsoncpp的api简要说明
1,解析(json字符串转为对象)
std::string strDataJson;
Json::Reader JReader;
Json::Value JObject;
if (!JReader.parse(strDataJson, JObject))
{
cerr << "parse json error." << endl;
return bSuccess;
}
2,读取
std::string strMsg = JRec["msg"].asString();
int nRetCode = JRec["ret"]..asInt();
Json::Value JList = JRec["data"]["list"];
int nSize = JList.size();
获取错误信息: JReader.getFormatedErrorMessages()
3,增加或修改
JRoot["stringdata"] = Json::Value("msg");
JRoot["intdata"] = Json::Value(10);
4,删除
JValue.removeMember("toberemove");
5,对象转为字符串
//输出无格式json字符串
Json::FastWriter fast_writer;
strJRecList = fast_writer.write(JRoot);
//格式化之后的json,有回车换行符
std::string strOut = JRoot.toStyledString();
#include "json/json.h"
const string fileName = "json.txt"; int main(int argc, char *argv[])
{
string line;
std::ifstream in(fileName.c_str());
if(!in)
return ; std::getline(in, line); Json::Reader reader;
Json::Value root; if(reader.parse(line, root))
cout << "suc" << endl;
else
cout << "fail" << endl; cout << root["status"].asInt() << endl;
cout << root["msg"].asString() << endl;
cout << root["forbidReason"].asString() << endl;
Json::Value root, ipPort;
string host;
unsigned int port = ; if(addrs.size() == )
root["hosts"].append(ipPort);
else
{
for(size_t i = ; i < addrs.size(); i++)
{
if(getIpAndPort(addrs[i], host, port))
{
ipPort["ip"] = host;
ipPort["port"] = port;
}
root["hosts"].append(ipPort);
}
}
http://blog.csdn.net/u014489596/article/details/44920557
son是一种数据交换格式,比较适合编写和阅读。jsoncpp是采用c++语言编写的用来处理json格式的第三包。直接来说明改如何使用它,本文是基于windows下的。
在github上下载jsoncpp的源代码包:https://github.com/open-source-parsers/jsoncpp。解压后用vs打开/makefiles/vs71/jsoncpp.sln项目,选择lib_json项目编译来生成lib文件,为了方便,debug和release都需要生成。
创建一个win32的空项目,将生成的lib文件包含,附加包含目录添加源代码中的include文件夹。后面简单说下比较常用的几种json处理方法。
解析json对象:
1.首先看看最简单的一种json格式,只有键-值的一重嵌套:
{
“id” : 123,
"name" : "wu"
}
我们直接将上面的数据初始化到到string对象中,方便解析,后面都是如此
- std::string json = "{\"id\" : 123, \"name\" : \"wu\"}";
- Json::Reader reader;
- Json::Value root;
- std::string name;
- int id = 0;
- if (reader.parse(json, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
- {
- name = root["name"].asString();
- id = root["id"].asInt();
- }
2.再看看数组的:
[ { "id" : 1, "name" : "wu"}, {"id":2, "name" : "tan"} ]
- std::string json = "[ {\"id\" : 1, \"name\" : \"wu\"}, {\"id\" : 2, \"name\" : \"tan\"} ]";
- Json::Reader reader;
- Json::Value root;
- std::string name;
- int id = 0;
- std::map<int, std::string> mapJson;
- if (reader.parse(json, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
- {
- for (int i = 0; i < root.size(); ++i)
- {
- name = root[i]["name"].asString();
- id = root[i]["id"].asInt();
- mapJson[id] = name;
- }
- }
3.如果是这样的数组:
{
“id” : [1, 2],
"name" : ["wu", "tan"]
}
- std::string json = "{\"id\" : [1, 2], \"name\" : [\"wu\", \"tan\"] } ";
- Json::Reader reader;
- Json::Value root;
- std::string name;
- int id = 0;
- if (reader.parse(json, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
- {
- for (int i = 0; i < root["id"].size(); ++i)
- {
- id = root["id"][i].asInt();
- }
- for (int i = 0; i < root["name"].size(); ++i)
- {
- name = root["name"][i].asString();
- }
- }
这种情况其实和上一种是类似的。
4.看看多重嵌套的情况,为了简便,我们嵌套两层:
{
"id" : 1,
"data" : {
"name" : "wu",
“age” : 26
}
}
- std::string json = "{\"id\" : 1, \"data\" : { \"name\" : \"wu\", \"age\" : 26 } }";
- Json::Reader reader;
- Json::Value root;
- std::string name;
- int id = 0;
- int age = 0;
- if (reader.parse(json, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
- {
- id = root["id"].asInt();
- name = root["data"]["name"].asString();
- age = root["data"]["age"].asInt();
- }
其实这种情况和第一种的类似,只是通过root["key"]取到的还是键值对,继续通过key取值即可。
基本上再复杂的数据格式也是上面几种情况的组合而已。
json对象的生成:
1.生成上面第一种情况的json格式:
- Json::Value root;
- root["id"] = 123;
- root["name"] = "wu";
- std::string json = root.toStyledString();
我们会将生成的json对象序列化到string对象中去,后面也是如此。
2.生成上面第二种情况的json:
- Json::Value root;
- for (int i = 0; i < 2; ++i)
- {
- root[i]["id"] = i + 1;
- if (0 == i)
- {
- root[i]["name"] = "wu";
- }
- else
- {
- root[i]["name"] = "tan";
- }
- }
- std::string json = root.toStyledString();
还可以这样生成:
- Json::Value root;
- Json::Value item;
- for (int i = 0; i < 2; ++i)
- {
- item["id"] = i + 1;
- if (0 == i)
- {
- item["name"] = "wu";
- }
- else
- {
- item["name"] = "tan";
- }
- root.append(item);
- }
- std::string json = root.toStyledString();
3.生成上面第三种情况的json:
- Json::Value root;
- for (int i = 0; i < 2; ++i)
- {
- root["id"].append(i);
- if (0 == i)
- {
- root["name"].append("wu");
- }
- else
- {
- root["name"].append("tan");
- }
- }
- std::string json = root.toStyledString();
4.生成上面第四种情况的json:
- Json::Value root;
- root["id"] = 1;
- root["data"]["name"] = "wu";
- root["data"]["age"] = 26;
- std::string json = root.toStyledString();
其实解析和生成json是互逆的,只要明白这几种情况,其他的无非是这几种情况的各种组合,原理是一样的。
版权声明:本文为博主原创文章,未经博主允许不得转载。
jsoncpp的api简要说明的更多相关文章
- ElasticSearch API 简要介绍
调用其API会返回很多信息,例如集群的信息,节点的信息等 检查集群的状态----Restful API说明 1:检查集群状态信息 2:管理集群 3:执行 增删改查 命令 4:执行高级命令 Restfu ...
- HTML5权威指南--Web Storage,本地数据库,本地缓存API,Web Sockets API,Geolocation API(简要学习笔记二)
1.Web Storage HTML5除了Canvas元素之外,还有一个非常重要的功能那就是客户端本地保存数据的Web Storage功能. 以前都是用cookies保存用户名等简单信息. 但是c ...
- HTML5权威指南--标签新变化,文件API,拖放API(简要学习笔记一)
1.标签元素更加语义化 2.内容类型仍然为“text/html” 扩展符仍然为html或者htm. <1>DOCTYPE 声明<!DOCTYPE html>就可 ...
- jsoncpp第二篇------API
更多API参考jsoncpp头文件 1 jsoncpp的api简要说明 1,解析(json字符串转为对象) std::string strDataJson; Json::Reader JReader ...
- 010 使用netmap API接管网卡,接收数据包,回应ARP请求
一.本文目的: 上一节中,我们已经在CentOS 6.7 上安装好了netmap,也能接收和发送包了,这节我们来调用netmap中的API,接管网卡,对网卡上收到的数据包做分析,并回应ARP请求. 二 ...
- sql server远程备份和恢复
sql server远程备份和恢复 SQLSERVER服务实例名称:192.168.0.2需要备份的数据库名称: a备份机器名称(Client端):192.168.0.3备份机用户:zf 密码:123 ...
- Math类中的BigDecimal
如果我们编译运行下面这个程序会看到什么? public class Test { public static void main(String args[]) { ...
- Java浮点数float,bigdecimal和double精确计算的精度误差问题总结
(转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结 ...
- 关于java中Double类型的运算精度问题
标题 在Java中实现浮点数的精确计算 AYellow(原作) 修改 关键字 Java 浮点数 精确计算 问题的提出:如果我们编译运行下面这个程序会看到什么?publi ...
随机推荐
- BZOJ3940: [Usaco2015 Feb]Censoring (AC自动机)
题意:在文本串上删除一些字符串 每次优先删除从左边开始第一个满足的 删除后剩下的串连在一起重复删除步骤 直到不能删 题解:建fail 用栈存当前放进了那些字符 如果可以删 fail指针跳到前面去 好菜 ...
- Android UI: LinearLayout中layout_weight 属性的使用规则
首先来查看android sdk文档,有这么一段话 LinearLayout also supports assigning a weight to individual children with ...
- POJ-1724 深搜剪枝
这道题目如果数据很小的话.我们通过这个dfs就可以完成深搜: void dfs(int s) { if (s==N) { minLen=min(minLen,totalLen); return ; } ...
- 2. 更改InnoDB redo日志文件的数量或大小
2. 更改InnoDB redo日志文件的数量或大小 要更改InnoDB 重做日志文件的数量或大小,请执行以下步骤: 1)停止MySQL服务器,确保正常关闭且没有错误发生 2) 编辑my.cnf以更改 ...
- 树梅派 -- 通过/sys读写ADC芯片 pcf8591
通过wiringPi等library, 在user space 通过/dev/i2c来读写i2c设备的方案不在本文讨论了. 编译SENSORS_PCF8591 模块 在Default raspberr ...
- js实现复制粘贴功能
在项目中使用到复制粘贴功能,虽然网上有很多大牛封装了很多的插件,但是还是想不去使用插件,就像自己来实现这个功能. 另一篇是禁止复制粘贴 前端er怎样操作剪切复制以及禁止复制+破解等 初步想法: 1. ...
- matlab自定义函数的五种表示(前2种重点)
1.命令文件/函数文件+函数文件:多个M文件 2.函数文件+子函数:一个M文件 3. inline:无需M文件 4.符号表达式+subs方式:无需M文件 5.字符串+subs方式:无需M文件 第一种: ...
- JSP行为
JSP行为标签使用XML语法结构来控制servlet引擎.它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等等.行为标签只有一种语法格式,它严格 ...
- python3 时间复杂度
时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就 ...
- BZOJ 1022: [SHOI2008]小约翰的游戏John【anti-SG】
Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取 ...