JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
JsonCpp 是一个C++用来处理JSON 数据的开发包。面讲一下怎么使用JsonCpp来序列化和反序列化Json对象,以实际代码为例子。

1、 编译jsoncpp
  从(http://jsoncpp.sourceforge.net/)下载源码包“jsoncpp-src-0.5.0.tar.gz”,解压后在其解压后目录中运行
$ scons platform=linux-gcc
  编译出来的库文件在其libs/ linux-gcc-4.4.2目录下,有libjson_linux-gcc-4.4.2_libmt.so和libjson_linux-gcc-4.4.2_libmt.a。头文件在解压目录下的include中。我的jsoncpp安装在$HOME/usr/jsoncpp下。

$ mkdir ~/usr/jsoncpp

$ cp -r include ~/usr/jsoncpp

$ cp -r libs ~/usr/jsoncpp

2、 Jsoncpp简单实例

1) 反序列化Json对象
  比如一个Json对象的字符串序列如下,其中”array”:[...]表示Json对象中的数组:

{“key1”:”value1”,”array”:[{“key2”:”value2”},{“key2”:”value3”},{“key2”:”value4”}]}

  那怎么分别取到key1和key2的值呢,代码如下所示:

#include <iostream>#include <string>#include "json/json.h" intmain(void){     std::string strValue = "{\"key1\":\"value1\",\"array\":[{\"key2\":\"value2\"},{\"key2\":\"value3\"},{\"key2\":\"value4\"}]}";      Json::Reader reader;     Json::Value value;      if(reader.parse(strValue, value))     {      std::string out = value["key1"].asString();      std::cout << out << std::endl;      constJson::Value arrayObj = value["array"];      for(inti=0; i<arrayObj.size(); i++)      {           out = arrayObj[i]["key2"].asString();           std::cout << out;           if(i != arrayObj.size() - 1)            std::cout << std::endl;      }     }     return0;}编译连接
$ g++ jscpp1.cpp -I$HOME/usr/jsoncpp/include/ ~/usr/jsoncpp/libs/linux-gcc-4.5.2/libjson_linux-gcc-4.5.2_libmt.a
$ ./a.out
value1
value2
value3
value4

2)序列化Json对象
  先构建一个Json对象,此Json对象中含有数组,然后把Json对象序列化成字符串,代码如下:#include <iostream>#include <string>#include "json/json.h" intmain(void){     Json::Value root;     Json::Value arrayObj;     Json::Value item;      for(inti = 0; i < 10; i ++)     {      item["key"] = i;      arrayObj.append(item);     }      root["key1"] = "value1";     root["key2"] = "value2";     root["array"] = arrayObj;     //root.toStyledString();     std::string out = root.toStyledString();     std::cout << out << std::endl;     return0;}

编译连接
$ g++ jscpp2.cpp -I$HOME/usr/jsoncpp/include/ ~/usr/jsoncpp/libs/linux-gcc-4.5.2/libjson_linux-gcc-4.5.2_libmt.a
$ ./a.out
{
   "array" : [
      {
         "key" : 0
      },
      {
         "key" : 1
      },
      {
         "key" : 2
      },
      {
         "key" : 3
      },
      {
         "key" : 4
      },
      {
         "key" : 5
      },
      {
         "key" : 6
      },
      {
         "key" : 7
      },
      {
         "key" : 8
      },
      {
         "key" : 9
      }
   ],
   "key1" : "value1",
   "key2" : "value2"
}

一般情况下在python下,习惯用字典来表示复杂类型。但是一般c++里边会用vector来存储复杂类型,那么就存在转换的问题,下面小段代码记录了将字符串转换为Vector的过程

待转换的字符串如下:

const char * jsongroupinfo="[{\"groupId\" :946838524,\"groupname\" :\"bababa\", \"mask\":1,\"parentid\":946755072}]";

Json::Reader reader;
    Json::Value json_object;
    if (!reader.parse(jsongroupinfo, json_object))
        return "parse jsonstr error";
    SUserChggroup sucg;
    VECTOR< SUserChggroup > m_groupInfo;
    for(int i = 0; i < json_object.size(); i ++)
    {
        Json::Value &current = json_object[i];
        sucg.m_groupId = current["groupId"].asInt();
        sucg.m_groupName = current["groupname"].asString();
        sucg.m_mask = current["mask"].asInt();
        sucg.m_parentId = current["parentid"].asInt();
        m_groupInfo.push_back(sucg);
    }

JsonCpp的简单使用方法的更多相关文章

  1. MySQL笔记-最简单的方法来解决找不到mysqld.sock文件的问题

    首先,环境:ubuntu 14.04,采用apt-get的方式安装的,手动安装可能路径设置稍有区别. 1.安装MySQL后,用命令行首次启动时发现找不到Mysqld.sock文件,提示: ERROR ...

  2. mfc显示静态图片最简单的方法

    一致都是研究如何调用opencv显示动态图片,但是很多时候在显示图标的时候,都是需要显示静态图片,现在将最简单的方法总结下: 1.添加picture控件 2.添加资源,要求为bmp 3.修改属性 结果 ...

  3. ECshop设置301最快捷最简单的方法

    ECshop设置301最快捷最简单的方法 在 init.php中加入以下代码 if (strtolower($_SERVER['SERVER_NAME'])!='www.fz1688.com') { ...

  4. git 的简单使用方法

    git 的简单使用方法1. 服务器 安装完成2. ssh 中的账号创建完成3. 创建 ssh 账号,会在 ssh 的安装目录下的home 目录里面,多了用户家目录4. 进入该目录 ,创建一个新的文件夹 ...

  5. JavaScript,一个超级简单的方法判断浏览器的内核前缀

    先说明,此处的方法是说超级简单的方法,不是指代码超级少,而是用非常简单的知识点,只要懂得怎么写JavaScript的行内样式就可以判断. 大家应该还记得JavaScript行内样式怎么写吧?(看来我是 ...

  6. NET MVC1项目升级到MVC2最简单的方法

    NET MVC1项目升级到MVC2最简单的方法 把MVC1项目升级到MVC2,最简单的做法如下: 新建MVC2项目 新建一个MVC2项目,把原来MVC1的项目文件全部拷贝到新建MVC2项目目录里,依照 ...

  7. js 获取当天23点59分59秒 时间戳 (最简单的方法)

    js 获取当天23点59分59秒 时间戳 (最简单的方法) new Date(new Date(new Date().toLocaleDateString()).getTime()+24*60*60* ...

  8. [ASP.NET]更简单的方法:FormsAuthentication登录ReturnUrl使用绝对路径

    转自:http://www.cnblogs.com/dudu/p/formsauthentication-returnurl-absoluteuri.html [ASP.NET]更简单的方法:Form ...

  9. ASP.Net MVC_DotNetZip简单使用方法,解决文件压缩的问题[转]

    准备工作: 在vs工具栏中找到NuGet   下载DotNetZip   现在就可以使用DotNetZip强大的类库了,在这里我给出一些简单的使用. ? 1 2 3 4 5 6 7 8 9 10 11 ...

随机推荐

  1. LintCode Balanced Binary Tree

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  2. 史上最详细Windows版本搭建安装React Native环境配置 转载,比官网的靠谱亲测可用

    史上最详细Windows版本搭建安装React Native环境配置   2016/01/29 |  React Native技术文章 |  Sky丶清|  95条评论 |  33530 views ...

  3. Appium 解决不能输入中文字符问题

    只需在初始化driver方法时,写这两行代码即可:   capabilities.setCapability("unicodeKeyboard", "True" ...

  4. JavaScript对象属性赋值操作的逻辑

    对象进行属性赋值操作时,其执行逻辑如下所示: 1. 当前对象中是否有该属性?有,进行赋值操作:没有,进行下一步判断. 2. 对象的原型链中是否有该属性?没有,在当前对象上创建该属性,并赋值:有,进行下 ...

  5. js 函数和变量的提升

    js 函数和变量的提升 1. 函数的作用域: js中 ,函数的作用域为函数,而不是大括号. var hei = 123;if(true){ hei = 456;}console.log(hei);// ...

  6. [BZOJ 3503][Cqoi 2014]和谐矩阵

    我觉得这一题的样例输出一点都不和谐,大家千万别像我一样被坑了…… 题目不算难,果然是进错省系列555,不过搞出 O(n*m*2m) 的还是不要挣扎的比较好 我们暴力地推出第 n 行 第 m 列中每个数 ...

  7. 如何在IIS 7.5中部署Asp.Net MVC 5的网站

    0 Sign in to vote 系统是 windwos 2008 已经安装.Net 4.0 和 .Net 4.5 已经安装MVC4 的需要文件,MVC5 找不见下载地方,求各位大哥告知一下在哪里可 ...

  8. ROC曲线

    1.混淆矩阵(confusion matrix)     针对预测值和真实值之间的关系,我们可以将样本分为四个部分,分别是:     真正例(True Positive,TP):预测值和真实值都为1 ...

  9. bzoj1513: [POI2006]Tet-Tetris 3D

    Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维的版本, 在里面很多立方体落在平面板,一个立方体开始落下直到碰上一 ...

  10. 手机端的click

    一:click事件的封装 手机端的click事件不是太好用, 1.点击会有延迟, 2.会出现一个灰色区域 就想到了用touch事件代替. touch事件有touchstart,touchmove,to ...