Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38153
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2016-11-10 10:25
文章分类
文章存档

2017年(4)

2016年(8)

我的朋友
最近访客

分类: C/C++

2017-02-15 15:42:51

原文地址:linux下jsoncpp的安装与使用 作者:kaede_1

一、了解jscon结构


1、值(value)可以是双引号括起来的字符串(string)、数值(number)、truefalse、 null、对象(object)或者数组(array)。这些结构可以嵌套。

2、字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

字符串(string)与C或者Java的字符串非常相似。

3、数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。


4、对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。



举个例子:{"letter_id":"u","name":"Kaede","id":21},其中letter_id、name、id都可以理解为string;而u、kaede、21为value

5、数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。


例子:[{"name":"大陆剧","id":"203"},{"name":"故事剧","id":"207"},{"name":"古装剧","id":"208"}],数组由三个元素组成,每个元素都是一个object

二、jsoncpp环境搭建jsoncpp的使用需要自己提前编译,生成对应的库,之后引用头文件、链接库即可使用编译jsoncpp需要scons
我使用的版本分别是
jsoncpp-src-0.5.0(目前有更新版本0.6.0)
下载地址为: style="font-family:'Verdana, Arial, Helvetica, sans-serif';">
scons-2.1.0(目前有更新版本2.3.5)
下载地址为: style="font-family:'Verdana, Arial, Helvetica, sans-serif';">
1.首先拷贝两个压缩包到制定路径下,解压scons,进入解压目录
export MYSCONS=`pwd`
2.然后执行命令
python $MYSCONS/setup.py install
3.解压缩jsoncpp,并进入对应路径下,执行命令
python $MYSCONS/script/scons platform=linux-gcc
执行后会在目录jsoncpp-src-0.5.0/libs/linux-gcc-4.1.2下生成libjson_linux-gcc-4.1.2_libmt.a  libjson_linux-gcc-4.1.2_libmt.so两个库文件
至此,环境搭建好了
所需要的头文件在:jsoncpp-src-0.5.0/include/json这个路径下
之后在程序中引用即可。

三、jscon的简单解析
对于解析json串来说,只需要用到两种类型Json::Reader 和 Json::Value
举一个例子,现有json串如下:
string strResponse的内容为{"data":[{"statistics":{"dislike_count":41,"comment":"tianqihao"}},{"statistics":{"dislike_count...}]}...(省略了部分信息)
可见,data关键字对应一个数组;而statistics关键字对应一个object;dislike_count和comment_count为string;41和tianqihao为value。

#include "json/json.h"
...
    Json::Reader reader;    
    Json::Value value;
    if(reader.parse(strResponse, value))
    {   
        Json::Value arrObj = value["data"];
        for(i=0; i<arrObj.size(); i++)
        {   
            if(!arrObj[i].isMember("statistics"))
                continue;
            Json::Value statis = arrObj[i]["statistics"];
            int iDisLike = statis["dislike_count"].asInt();
            string str = statis["comment"].asString();
        }
    }

以上是解析简单json结构的,对于复杂的嵌套结构解析类似,都是通过Json::Value tmp=value[key]获取下一层的结构,然后Json::Value subTmp=key[subkey],最后通过string strResult = subTmp[node].asString();或者int iResult = subTmp[node].asInt();即可。
对于负责的例子,如:
{"data":[{"statistics":{"dislike_count":0,"comment":"tianqihao"},"snippet":{"original":0,"privacy":"anybody","category":{"letter_id":"u","name":"娱乐","id":86}}},.....]
想要解析letter_id,可通过如下方法:
1.string test1 = arrObj[i]["snippet"]["category"].get("letter_id", “a").asString();
2.string test2 = arrObj[i]["snippet"]["category"]["letter_id"].asString();
3.通过Json::Value先后获取snippet、category,之后category["letter_id"].asString();

g++ -g -o exx *.cpp -I path/include path/libjson_linux-gcc-4.1.2_libmt.a

编译获取会遇到的问题:

在使用过程中,我习惯性的将头文件和库文件分别放到我自己的工作目录下,即将json相关的头文件全放在自己的inc文件夹下,导致编译出错,报错如下:

/usr/include/sys/cdefs.h:46:44: 错误:标识符“(”前缺少二元运算符

/usr/include/sys/cdefs.h:50:44: 错误:标识符“(”前缺少二元运算符

/usr/include/sys/cdefs.h:135:19: 错误:标识符“(”前缺少二元运算符

/usr/include/sys/cdefs.h:151:19: 错误:标识符“(”前缺少二元运算符

问题是必须保留include/json/这种结构,不能一股脑的将include/json下的文件拷出到inc下


相关链接:
1. /> 2. /> 3.
http://www.cnblogs.com/kingcat/archive/2012/06/14/2549050.html    //安装,但存在问题
4.http://www.cnblogs.com/kex1n/archive/2011/12/02/2272328.html    //jsoncpp的简单使用
5.http://blog.csdn.net/timothy721/article/details/19993495    //
6.   //rapidjson和jsoncpp的对比


阅读(3966) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~