linux下jsoncpp的编译和测试使用

http://blog.csdn.net/ljp1919/article/details/48319779

1、预备条件: JsonCPP类库http://sourceforge.net/projects/jsoncpp/?source=dlp SCONS编译器http://sourceforge.net/projects/scons/?source=dlp Pythonhttp://www.python.org/

JsonCPP类库需要Scons编译器来编译,而Scons需要Python安装了才能使用。具体安装步骤请参见文件夹下的ReadMe文件。

2、

安装scons:

sudo apt-get install scons

解包jsoncpp:

tar -zxf jsoncpp-src-0.5.0.tar.gz

jsoncpp安装:

解包后进入其目录。输入以下命令:

scons platform=linux-gcc  就会安装成功

3、

上述已经完成jsoncpp的编译,在解压目录jsoncpp-src-0.5.0/libs/linux-gcc-4.8下可以看到生成了两个文件:     libjson_linux-gcc-4.8_libmt.a     libjson_linux-gcc-4.8_libmt.so

这两个分别是生成静态和动态库文件。如下图所示:

把.a 和.so 文件拷贝到/usrl/lib 目录下(参考了不同资料,说法并不统一,有的是拷贝到/lib下,有的则是/usr/local/lib),可以为了方便编译给它改个名字libjsonlib.a

同样,将解包目录下的(/home/liujiepeng/Downloads/jsoncpp-src-0.5.0)的include拷贝到/usr/lib下面。

sudo mv include/json/ /usr/include/

移动之后的结果:

4、代码测试:

测试环境为Qtcreator,所以需要在LIBS中对其进行添加:

在pro中进行添加LIBS += /usr/lib/libjson_linux-gcc-4.8_libmt.so

如下图所示:

当然,多数情况下是将动态链接库的名字改得简单些。

也可以将.a和.so的文件直接复制在工程目录下,那么就不用写那么长的路径,直接"./libjson_linux-gcc-4.8_libmt.so"就可以了。

代码如下:

[cpp] view plaincopy

  1. #include<json/json.h>
  2. #include<iostream>
  3. using namespace std;  
  4. int main(int argc, char** argv)  
  5. {  
  6. Json::Value root;  
  7. Json::FastWriter fast;  
  8. root["ModuleType"]= Json::Value("你好");  
  9. root["ModuleCode"]= Json::Value("22");  
  10. root["ModuleDesc"]= Json::Value("33");  
  11. root["DateTime"]= Json::Value("44");  
  12. root["LogType"]= Json::Value("55");  
  13. cout<<fast.write(root)<<endl;  
  14. return 0;  
  15. }  

Jsoncpp 的 Json::Writer 类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。

测试结果:

5、采用命令行的形式进行编译:

编译的语句:

g++ -o client client.c -L/usr/lib/libjson_linux-gcc-4.8_libmt.a /usr/lib/libjson_linux-gcc-4.8_libmt.so

结果如下:

注明:当为存放位置建立一个别名时,可以采用以下的方式$LD_LIBRARY_PATH/libjson_linux-gcc-4.8_libmt.a$LD_LIBRARY_PATH/libjson_linux-gcc-4.8_libmt.so

6、json的读写例子2

[cpp] view plaincopy

  1. #include<json/json.h>
  2. #include<iostream>
  3. using namespace std;  
  4. int main(int argc, char** argv)  
  5. {      
  6.     Json::Value root;  
  7.     Json::FastWriter fast;  
  8.     Json::Value json_temp;// 临时对象,供如下代码使用
  9.     json_temp["name"] = Json::Value("helloworld");  
  10.     json_temp["age"] = Json::Value(26);  
  11.     root["a"]= Json::Value("1");//字符型.新建一个 Key(名为:a),赋予字符串值:"value_string"。
  12.     root["b"]= Json::Value(2);//数字
  13.     root["c"]= Json::Value(false);//新建一个 Key(名为:c),赋予bool值:false。
  14.     root["d"]= Json::Value(3.14);//新建一个 Key(名为:d),赋予 double 值:3.14
  15.     root["key_object"]= json_temp;//新建一个 Key(名为:key_object),赋予 json::Value 对象值
  16.     root["key_array"].append("array_string");// 新建一个 Key(名为:key_array),类型为数组,对第一个元素赋值为字符串:"array_string"。
  17.     root["key_array"].append(1234);  
  18.     cout<<fast.write(root)<<endl;  
  19.     Json::StyledWriter styled_writer;//另一种格式化的方式,输出结果的格式不一样
  20.     cout << styled_writer.write(root) <<endl;  
  21. //
  22.     cout<<"读取root中各个成员的信息:"<<endl;  
  23.     string a = root["a"].asString();  
  24.     cout<<"a的值:"<<a<<endl;  
  25.     string name=root["key_object"]["name"].asString();  
  26.     cout<<"读取子节点信息:"<<name<<endl;  
  27. //Json::Reader 是用于读取的,说的确切点,是用于将字符串转换为 Json::Value 对象的
  28.     cout<<"以下展现读操作:"<<endl;  
  29.     Json::Reader reader;  
  30.     Json::Value json_object;  
  31.     Json::Value json_object1;  
  32. const char* json_document = "{\"age\": 26,\"name\" :\"helloworld\"}";  
  33. const char *json_my = "{\"candidates\":[{\"accesskey\":\"BC75CA64\",\"adjust\":0,\"duration\":278000,\"id\":\"16080455\",\"score\":60,\"singer\":\"席琳迪翁\",\"song\":\"my heart will good go on\",\"uid\":\"1000000010\"}],\"info\":\"OK\",\"keyword\":\"Céline Dion - My Heart Will Go On\",\"proposal\":\"16080455\",\"status\":200}";  
  34. if (!reader.parse(json_document, json_object))  
  35. return 0;  
  36.     cout << json_object["name"];//自带换行?
  37.     cout << json_object["age"] << endl;  
  38. if (!reader.parse(json_my, json_object1))  
  39. return 0;  
  40.     Json::StyledWriter styled_writer1;//另一种格式化的方式,输出结果的格式不一样
  41.     cout << json_object1["keyword"];//自带换行?
  42.     cout << styled_writer1.write(json_object1) <<endl;  
  43. return 0;  
  44. }  

代码结果如下所示:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

无法将类型“System.Collections.Generic.IEnumerable<EmailSystem.Model.TemplateInfo>”隐式转换为“System.Collection

2841
来自专栏Porschev[钟慰]的专栏

【2013年】开发常见问题回顾(一)

记录开发中遇到的和别人问的较多的问题.... IE10中LinkButton不可用     这应该是2013年初遇到的一个BUG,当使用Asp.Net开发Web...

2895
来自专栏GreenLeaves

WCF系列教程之消息交换模式之请求与答复模式(Request/Reply)

1、使用WCF请求与答复模式须知 (1)、客户端调用WCF服务端需要等待服务端的返回,即使返回类型是void (2)、相比Duplex来讲,这种模式强调的是客户...

22910
来自专栏张善友的专栏

HTML生成PDF(c#)

Calling wkhtmltopdf to generate PDF from HTML 老外最多人加分的那篇做法,使用wkhtmtopdf(GPL协议)可以...

24210
来自专栏GreenLeaves

WCF系列教程之WCF客户端调用服务

1、创建WCF客户端应用程序需要执行下列步骤 (1)、获取服务终结点的服务协定、绑定以及地址信息 (2)、使用该信息创建WCF客户端 (3)、调用操作 (4)、...

2319
来自专栏c#开发者

如何给DataGrid添加自动增长列

如何给DataGrid添加自动增长列 我想我们都知道在数据库中如何添加自增长列,我们可以将这个自增长列绑定到DataGrid上使得用户方便的知道现在是第几行,今...

43810
来自专栏王清培的专栏

Redis 数据结构与内存管理策略(下)

Redis 数据结构与内存管理策略(下) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 作者:王清培...

3298
来自专栏跟着阿笨一起玩NET

System.Threading.Tasks.Task引起的IIS应用程序池崩溃

2. 从服务器端看(Windows Server 2008 + IIS 7.0),在事件日志中会出现Event ID为5010的错误:

2632
来自专栏王磊的博客

ASP.NET 缓存 Cache

ASP.NET 提供一个功能完整的缓存引擎,页面可使用该引擎通过 HTTP 请求存储和检索任意对象. 缓存的生存期与应用程序的生存期相同,也就是说,当应用程序重...

4495
来自专栏大内老A

如何实现对上下文(Context)数据的统一管理 [提供源代码下载]

在应用开发中,我们经常需要设置一些上下文(Context)信息,这些上下文信息一般基于当前的会话(Session),比如当前登录用户的个人信息;或者基于当前方法...

5046

扫码关注云+社区

领取腾讯云代金券