JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
JSON建构于两种结构:
- “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
JSON具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true
、false
、 null
、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
字符串(string)与C或者Java的字符串非常相似。
数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
空白可以加入到任何符号之间。 以下描述了完整的语言。
1. 下载jsoncpp源码
C++要使用JSON来解析数据,一般采用jsoncpp.
网站:http://sourceforge.net/projects/jsoncpp/
我下载的时候最新版本是 jsoncpp-src-0.5.0.tar.gz
这里有一个拷贝(http://dl.iteye.com/topics/download/4cb5ff91-e210-3e0b-9496-fd31a787a6c7)
解压到一个目录,然后编译成对应机器可用的lib。然后引入它的json.h头文件就可以使用了。
2. 下载编译jsoncpp的python编译工具并配置环境变量到临时console
关键是这个lib怎么编译出来,下面说一下步骤:
编译jsconcpp要使用scons,scons又是一个牛叉的工具,功能和GNU make一样,又比make简单多了。scons是python工具,需要先安装好python。
下载 scons,解压就可以使用了。
scons下载地址:http://sourceforge.net/projects/scons/files/scons/2.3.0/ 本文附件中也有一个拷贝
在要编译jsoncpp的console中导出scons的环境变量临时用一下即可。不必配置到开机启动的环境变量中。
$export MYSCONS=your_extract_path
$export MYSCONS_LIB_DIR=$MYSCONS/engine
3. 编译jsoncpp lib
$ cd jsoncpp-src-0.5.0
$ python $MYSCONS/script/scons platform=linux-gcc
一切正常的话,可以在 jsoncpp-src-0.5.0/libs/linux-gcc-x.x 下看到一个动态文件库(so)和一个静态文件库(a)。
4. 将jsoncpp库拷贝到系统库下方便使用。
$ cd jsoncpp-src-0.5.0/libs/linux-gcc-4.7
$ mv libjson_linux-gcc-4.7_libmt.so libjson.so
$sudo cp libjson.so /usr/lib
5. 写测试程序
5.1 简单测试读写
#include <cassert> #include "json/json.h" using namespace std; int main() { string json_str = "{\"name\":\"zzg\",\"age\":100}"; Json::Reader reader; Json::Value root; if (!reader.parse(json_str, root, false)) { cout<<"parse error"<<endl; return -1; } cout << "test read:" << endl; std::string name = root["name"].asString(); int age = root["age"].asInt(); std::cout<<name<<std::endl; std::cout<<age<<std::endl; cout<<"test write:"<<endl; Json::FastWriter writer; json_str = writer.write(root); cout<<json_str<<endl; return 0; }
编译并运行:
$ g++ test.cpp -ljson
$./a.out
结果:
test read:
zzg
100
test write:
{"age":100,"name":"zzg"}
5.2 测试读取json文件
#include <fstream> #include <cassert> #include "json/json.h" using namespace std; int main() { ifstream ifs; ifs.open("testjson.json"); assert(ifs.is_open()); Json::Reader reader; Json::Value root; if (!reader.parse(ifs, root, false)) { return -1; } std::string name = root["name"].asString(); int age = root["age"].asInt(); std::cout<<name<<std::endl; std::cout<<age<<std::endl; return 0; }
testjson.json文件内容为:
{
"name" : "小楼一夜听春雨",
"age" : 27
}
参考资料:
【1】http://www.cnblogs.com/kex1n/archive/2011/12/02/2272328.html
【2】http://blog.sina.com.cn/s/blog_698f90230100xy6w.html
相关推荐
### JsonCpp 使用指南 #### 一、JSON 数据格式与语法 JSON (JavaScript Object Notation) 是一种简洁且高效的数据交换格式。它源自于 JavaScript 的一部分语法,并被设计为跨平台和语言独立的数据交换标准。 ####...
JSONCPP使用说明文档主要介绍了如何在C++中利用jsoncpp库进行JSON数据的解析和构建。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它的语法简单且与多种编程语言兼容,使得数据交换变得方便快捷...
在描述中提到的"JSONCPP使用-2"和"JSONCPP使用-3"可能是后续教程或文档的部分,它们可能涵盖了更高级的主题,如流式解析、错误处理、深度遍历JSON树以及在MFC(Microsoft Foundation Classes)框架中的集成。...
JSONCPP使用实例,需配合JSONCPP使用-1、JSONCPP使用-3使用
### JSONCPP使用详解 #### JSON简介 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,广泛应用于网络通信及软件系统之间的数据传输。它基于ECMAScript的一个子集,具备良好的跨语言兼容性,使得它...
#### 五、jsoncpp使用详解 jsoncpp的核心功能是通过`Json::Value`类来实现的,它提供了丰富的接口来处理JSON数据。 **1. Json::Value 类型介绍** `Json::Value`是jsoncpp中最核心的类,它可以用来表示JSON中的...
Jsoncpp是一个开源库,用于在C++中解析、生成和操作JSON(JavaScript Object Notation)数据格式。...以上就是关于Jsoncpp使用的基本知识点,通过理解和掌握这些内容,你就可以在C++项目中有效地处理JSON数据了。
JSONCPP使用详解与示例 JSONCPP是一个C++编写的开源库,用于处理JSON(JavaScript Object Notation)格式的数据。这个库提供了面向对象的接口,方便开发者在C++项目中进行JSON的序列化和反序列化操作。JSON是一种轻...
在使用JSONCPP之前,需要将其安装到开发环境中。通常,你可以通过包管理器(如Ubuntu的`apt-get`或Windows的`vcpkg`)来安装,或者直接从GitHub源码编译。安装完成后,确保链接库和头文件路径正确添加到项目配置中。...
在本场景中,我们讨论的是使用Visual Studio 2022(VS2022)编译的JSONCPP静态库,该库适用于64位系统,并且是Release版本,这意味着它已经过优化,适合在生产环境中使用。 首先,了解JSONCPP的基本概念至关重要。...
注意,JsonCPP使用了错误处理机制,如果解析失败,会抛出错误信息。 在实际应用中,JsonCPP不仅可以用于解析JSON,还可以用于生成JSON。例如,你可以创建一个`Json::Value`对象,添加数据,然后转换回JSON字符串。...
#### 五、JSONCPP使用详解 1. **Value 类** `Json::Value` 类是最基本的类,用于表示JSON数据的各种类型。下面是一个简单的示例: ```cpp Json::Value json_temp; // 临时对象,供如下代码使用 json_temp[...
本篇文章将深入探讨三个关键的技术点:QWebChannel、QWebSocket以及jsoncpp,它们都是实现高效、可靠通信的重要工具。 首先,我们来讨论QWebChannel。这是Qt框架提供的一种高级通信机制,它允许Qt应用程序与Web页面...
JSONCPP是一个开源库,专为处理JSON(JavaScript Object Notation)数据格式而设计。...通过`Testjsoncpp.sln`和`Testjsoncpp`中的测试,我们可以深入理解JSONCPP的特性和功能,并确保在实际项目中稳定可靠地使用它。
**三、JSonCpp使用方法** 1. **安装与链接**: - 编译源码并生成静态或动态库,然后链接到项目中。 - 或者直接将源码包含到项目中,避免额外的编译步骤。 2. **基本使用**: - `Json::Value`类是JSON数据的核心...
6. **内存管理**:Jsoncpp使用智能指针(如`Json::Value`)来管理内存,防止内存泄漏。但是,在处理大量数据时,仍需注意性能和内存消耗。 总之,Jsoncpp作为C++中处理JSON数据的强大工具,不仅支持基础类型如`long...
这里我们将编写JSONcpp的基本使用示例。首先,包含必要的头文件: ```cpp #include #include ``` 然后,我们可以创建一个JSON对象并进行操作: ```cpp int main() { // 创建一个JSON对象 Json::Value root; ...
#### 四、jsoncpp使用详解 jsoncpp提供了一组类来处理JSON数据,主要包括`Value`、`Reader`和`Writer`三个核心类。所有这些类都位于`Json`命名空间中。 **1. Value** `Json::Value`是jsoncpp中最基本也是最重要的...
9. **内存管理**:JSONCPP使用引用计数来管理内存,这意味着在大多数情况下,对象会在不再被引用时自动释放,减少了手动内存管理的复杂性。 10. **版本兼容性**:不同的JSONCPP版本可能有不同的API或功能,所以确保...