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对象中,方便解析,后面都是如此

  1. std::string json = "{\"id\" : 123, \"name\" : \"wu\"}";
  2. Json::Reader reader;
  3. Json::Value root;
  4. std::string name;
  5. int id = 0;
  6. if (reader.parse(json, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素
  7. {
  8. name = root["name"].asString();
  9. id = root["id"].asInt();
  10. }

2.再看看数组的:

[ { "id" : 1, "name" : "wu"},  {"id":2, "name" : "tan"} ]

  1. std::string json = "[ {\"id\" : 1, \"name\" : \"wu\"}, {\"id\" : 2, \"name\" : \"tan\"} ]";
  2. Json::Reader reader;
  3. Json::Value root;
  4. std::string name;
  5. int id = 0;
  6. std::map<int, std::string> mapJson;
  7. if (reader.parse(json, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素
  8. {
  9. for (int i = 0; i < root.size(); ++i)
  10. {
  11. name = root[i]["name"].asString();
  12. id = root[i]["id"].asInt();
  13. mapJson[id] = name;
  14. }
  15. }

3.如果是这样的数组:

{

“id” : [1, 2],

"name" : ["wu", "tan"]

}

  1. std::string json = "{\"id\" : [1, 2], \"name\" : [\"wu\", \"tan\"] } ";
  2. Json::Reader reader;
  3. Json::Value root;
  4. std::string name;
  5. int id = 0;
  6. if (reader.parse(json, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素
  7. {
  8. for (int i = 0; i < root["id"].size(); ++i)
  9. {
  10. id = root["id"][i].asInt();
  11. }
  12. for (int i = 0; i < root["name"].size(); ++i)
  13. {
  14. name = root["name"][i].asString();
  15. }
  16. }

这种情况其实和上一种是类似的。

4.看看多重嵌套的情况,为了简便,我们嵌套两层:

{

"id" : 1,

"data" : {

"name" : "wu",

“age” : 26

}

}

  1. std::string json = "{\"id\" : 1, \"data\" : { \"name\" : \"wu\",  \"age\" : 26 } }";
  2. Json::Reader reader;
  3. Json::Value root;
  4. std::string name;
  5. int id = 0;
  6. int age = 0;
  7. if (reader.parse(json, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素
  8. {
  9. id = root["id"].asInt();
  10. name = root["data"]["name"].asString();
  11. age = root["data"]["age"].asInt();
  12. }

其实这种情况和第一种的类似,只是通过root["key"]取到的还是键值对,继续通过key取值即可。

基本上再复杂的数据格式也是上面几种情况的组合而已。

json对象的生成:

1.生成上面第一种情况的json格式:

  1. Json::Value root;
  2. root["id"] = 123;
  3. root["name"] = "wu";
  4. std::string json = root.toStyledString();

我们会将生成的json对象序列化到string对象中去,后面也是如此。

2.生成上面第二种情况的json:

  1. Json::Value root;
  2. for (int i = 0; i < 2; ++i)
  3. {
  4. root[i]["id"] = i + 1;
  5. if (0 == i)
  6. {
  7. root[i]["name"] = "wu";
  8. }
  9. else
  10. {
  11. root[i]["name"] = "tan";
  12. }
  13. }
  14. std::string json = root.toStyledString();

还可以这样生成:

  1. Json::Value root;
  2. Json::Value item;
  3. for (int i = 0; i < 2; ++i)
  4. {
  5. item["id"] = i + 1;
  6. if (0 == i)
  7. {
  8. item["name"] = "wu";
  9. }
  10. else
  11. {
  12. item["name"] = "tan";
  13. }
  14. root.append(item);
  15. }
  16. std::string json = root.toStyledString();

3.生成上面第三种情况的json:

  1. Json::Value root;
  2. for (int i = 0; i < 2; ++i)
  3. {
  4. root["id"].append(i);
  5. if (0 == i)
  6. {
  7. root["name"].append("wu");
  8. }
  9. else
  10. {
  11. root["name"].append("tan");
  12. }
  13. }
  14. std::string json = root.toStyledString();

4.生成上面第四种情况的json:

  1. Json::Value root;
  2. root["id"] = 1;
  3. root["data"]["name"] = "wu";
  4. root["data"]["age"] = 26;
  5. std::string json = root.toStyledString();

其实解析和生成json是互逆的,只要明白这几种情况,其他的无非是这几种情况的各种组合,原理是一样的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

jsoncpp的api简要说明的更多相关文章

  1. ElasticSearch API 简要介绍

    调用其API会返回很多信息,例如集群的信息,节点的信息等 检查集群的状态----Restful API说明 1:检查集群状态信息 2:管理集群 3:执行 增删改查 命令 4:执行高级命令 Restfu ...

  2. HTML5权威指南--Web Storage,本地数据库,本地缓存API,Web Sockets API,Geolocation API(简要学习笔记二)

    1.Web Storage HTML5除了Canvas元素之外,还有一个非常重要的功能那就是客户端本地保存数据的Web Storage功能. 以前都是用cookies保存用户名等简单信息.   但是c ...

  3. HTML5权威指南--标签新变化,文件API,拖放API(简要学习笔记一)

    1.标签元素更加语义化   2.内容类型仍然为“text/html”    扩展符仍然为html或者htm.    <1>DOCTYPE 声明<!DOCTYPE html>就可 ...

  4. jsoncpp第二篇------API

    更多API参考jsoncpp头文件 1  jsoncpp的api简要说明 1,解析(json字符串转为对象) std::string strDataJson; Json::Reader JReader ...

  5. 010 使用netmap API接管网卡,接收数据包,回应ARP请求

    一.本文目的: 上一节中,我们已经在CentOS 6.7 上安装好了netmap,也能接收和发送包了,这节我们来调用netmap中的API,接管网卡,对网卡上收到的数据包做分析,并回应ARP请求. 二 ...

  6. sql server远程备份和恢复

    sql server远程备份和恢复 SQLSERVER服务实例名称:192.168.0.2需要备份的数据库名称: a备份机器名称(Client端):192.168.0.3备份机用户:zf 密码:123 ...

  7. Math类中的BigDecimal

    如果我们编译运行下面这个程序会看到什么? public class Test {    public static void main(String args[]) {                 ...

  8. Java浮点数float,bigdecimal和double精确计算的精度误差问题总结

    (转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结 ...

  9. 关于java中Double类型的运算精度问题

    标题     在Java中实现浮点数的精确计算    AYellow(原作) 修改    关键字     Java 浮点数 精确计算   问题的提出:如果我们编译运行下面这个程序会看到什么?publi ...

随机推荐

  1. No-9.vi __终端中的编辑器

    vi —— 终端中的编辑器 01. vi 简介 1.1 学习 vi 的目的 在工作中,要对 服务器 上的文件进行 简单 的修改,可以使用 ssh 远程登录到服务器上,并且使用 vi 进行快速的编辑即可 ...

  2. VS C++项目报错warning C4199: ……use /Zc:twoPhase-

    具体的报错如下: c1xx : warning C4199: two-phase name lookup is not supported for C++/CLI, C++/CX, or OpenMP ...

  3. Tomcat server.xml配置文件

    server.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to ...

  4. 读书笔记之《编程小白的第1本Python入门书》

    本书电子版下载地址:百度网盘 写在前面:你需要这本书的原因 有没有那一个瞬间,让你想要放弃学习编程? 在我决心开始学编程的时候,我为自己制定了一个每天编程1小时的计划,那时候工作很忙,我只能等到晚上9 ...

  5. LeetCode(37) Sudoku Solver

    题目 Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by ...

  6. 《C++专项练习》 — (2)

    序 C++基础专项练习二,,,水平依然不到家! 错题分析与总结 1 . 有如下模板定义: template <class T> T fun(T x,T y){ return x*x+y*y ...

  7. python接口自动化-有token的接口项目使用unittest框架设计

    获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...

  8. [转载] Asynchronous ActionScript Execution

    Asynchronous ActionScript Execution Date September 19, 2009 Language ActionScript 3.0 Target Flash P ...

  9. [luoguP1198][JSOI2008] 最大数(线段树 || 单调栈)

    题目传送门 1.线段树 线段树可以搞. 不过慢的要死1300+ms #include <cstdio> #include <iostream> using namespace ...

  10. 【搜索】codeforces C. The Tag Game

    http://codeforces.com/contest/813/problem/C [题意] 给定一棵有n个结点的树,初始时Alice在根结点1,Bob在非根结点x; Alice和Bob轮流走,每 ...