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. Java 设计一个贷款计算器 简易

    import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.border.*; publi ...

  2. 关于清除丢失贴图与IES文件

    fn YY_clrmessingmaps = ( YY_messingmap = #() allBitmaps = getClassInstances BitmapTexture -- 所有材质 to ...

  3. windows ftp 连接serv_U 管理员

    连接工具名称:8uftp 小技巧:活动模式连接

  4. Xcode解决代码高亮、语法提示、错误警告等功能失效的解决方法

    在编写xcode的项目的时候出现过代码不高亮的症状,而且所有的warning都不再提示,include的内容也显示symbol not found,非常奇怪,解决方案如下: 方法一: 1.把.pch里 ...

  5. Android Programing 学习笔记(一)

    最近学习android 开发,拜读android programing,一步一步学习.囫囵吞枣,现已看到第十八章.今天把最近的学习过程中学到的一些内容进行一下总结. 一:Fragment 和 Acti ...

  6. css3立体旋转

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. ruby formatting time

    %Y%m%d => 20071119 Calendar date (basic) %F => 2007-11-19 Calendar date (extended) %Y-%m => ...

  8. 链地址法实现HashMap

    前注:本文介绍的HashMap并非Java类库的实现.而是根据哈希表知识的一个实现. 上文介绍了开放地址法实现HashTable,它的缺点是对hashCode映射为地址后如果出现重复地址,则会占用其他 ...

  9. do-while语句

    一.语句格式格式1:do  语句1;while (条件表达式); 格式2:do {  语句1;  语句2;  -}while (条件表达式); 语句执行过程:1.执行一遍循环体.2.求出作为循环条件的 ...

  10. 创建sa账号

    ①以windows身份验证的方式默认登陆 ②选择安全性下的登录名中的sa账号,右键选择属性,进行相关项的设置 ③将sa账号的状态中对应的登录项由之前的禁用,改为已启用 ④将sa对应的密码进行修改为自己 ...