一、基本概念
1、定义
官方对JSON格式的定义:
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最初的来源于JavaScript这门语言,随着被广泛使用,几乎每门开发语言都有处理JSON的API。常常被用作数据交互的两种交互格式是json和xml,我之前也使用过一个叫mini-XML的库进行xml文件的解析,但是使用起来并没有jsoncpp这么容易上手。
json的官网:http://www.json.org/json-zh.html,在官网有对json的基本介绍,并且提供了不同语言支持json的库的列表,可根据自己的实际情况进行调用。
2、语法规则
JSON有2种结构形式,以键值对形式或数组形式,官网关于这两种结构的描述如下:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
2.1 对象的表示
对象由一个大括号包括,括号后面可以只跟一个空格字符,也可以在空格后面跟键:值,键:值的数量没有限制。如果要给这个对象命名,则需要在中括号前加上对象名:{ ... }。
下图来源自json官网:
2.2 数组的表示
数组和我们C、C++理解的数组是相同的,可以是数字(整数或小数)数组或者字符串数组,由一个中括号包括,如果要给这个对象命名,则需要在中括号前加上数组名:[......]。
下图来源自json官网:
2.3 对象或数组中的值
JSON的值有六种形式:对象、数组、字符串、数字和三个字面值(false、null、true),其中对象和数组是可以互相嵌套的。
下图来源自json官网:
2.4 小结
官网中还有更加详细的说明,这里就不进行一一例举了,最基本的就是上面这些。在这里给出一个实例,在下一节中,展示一下使用jsoncpp如何实现对这个json文件的读写的:
{
"person":
{
"name": "pig",
"age": 18,
"sex": "man",
"hometown":
[
{
"province": "guangdong",
"country": "guangzhou" ,
}
],
"height": 1.75,
"weight": 70,
"major": ["engineer","singer"],
"others":
[
{
"lucky number": [6,7,8,9]
},
{
"constellation": "scorpio"
}
]
}
}
二、jsoncpp
我的另一篇文章从GitHub获取jsoncpp进行编译有关于如何编译jsoncpp并在工程中使用。在这里我们一步一步实现上一节的这个实例。
1、对象操作
实现在原有对象上添加一个新的person对象
int main()
{
//一个根对象
Json::Value root;
//定义子对象person
Json::Value json_person;
//添加数据
json_person["name"] = "pig";
json_person["age"] = 2;
json_person["sex"] ="man";
json_person["height"] = 1.74;
json_person["weight"] = 70;
//将person挂到根节点
root["person"] = json_person;
//将Json对象序列化为字符串
cout << root.toStyledString() << endl;
return 0;
}
输出结果:
{
"person" :
{
"age" : 2,
"height" : 1.74,
"name" : "pig",
"sex" : "man",
"weight" : 70
}
}
2、数组操作
向对象中添加数组
int main()
{
//一个根对象
Json::Value root;
//定义子对象person
Json::Value json_person;
//数组节点
Json::Value json_hometown;
Json::Value json_others;
//添加数据
json_person["name"] = "pig";
json_person["age"] = 2;
json_person["sex"] ="man";
json_person["height"] = 1.74;
json_person["weight"] = 70;
//向对象中添加数组
json_person["major"].append("engineer");
json_person["major"].append("singer");
//将person挂到根节点
root["person"] = json_person;
//将Json对象序列化为字符串
cout << root.toStyledString() << endl;
return 0;
}
输出结果:
{
"person" :
{
"age" : 2,
"height" : 1.74,
"major" :
[
"engineer",
"singer"
],
"name" : "pig",
"sex" : "man",
"weight" : 70
}
}
3、数组中嵌套对象
在数组中嵌套一个对象
int main()
{
//一个根对象
Json::Value root;
//定义子对象person
Json::Value json_person;
//数组节点
Json::Value json_hometown;
Json::Value json_others;
//添加数据
json_person["name"] = "pig";
json_person["age"] = 2;
json_person["sex"] ="man";
json_person["height"] = 1.74;
json_person["weight"] = 70;
//数组中添加对象
json_hometown["province"].append("guangdong");
json_hometown["country"].append("guangzhou");
json_person["hometown"].append(json_hometown);
//向对象中添加数组
json_person["major"].append("engineer");
json_person["major"].append("singer");
//将person挂到根节点
root["person"] = json_person;
//将Json对象序列化为字符串
cout << root.toStyledString() << endl;
return 0;
}
输出结果:
{
"person" :
{
"age" : 2,
"height" : 1.74,
"hometown" :
[
{
"country" :
[
"guangzhou"
],
"province" :
[
"guangdong"
]
}
],
"major" :
[
"engineer",
"singer"
],
"name" : "pig",
"sex" : "man",
"weight" : 70
}
}
在数组中嵌套多个对象的代码:
int main()
{
//一个根对象
Json::Value root;
//定义子对象person
Json::Value json_person;
//数组节点
Json::Value json_hometown;
Json::Value json_others;
//添加数据
json_person["name"] = "pig";
json_person["age"] = 2;
json_person["sex"] ="man";
json_person["height"] = 1.74;
json_person["weight"] = 70;
//数组中嵌套对象
json_hometown["province"].append("guangdong");
json_hometown["country"].append("guangzhou");
json_person["hometown"].append(json_hometown);
//数组中嵌套多个对象
Json::Value json_lucky_num;
for (int i = 0; i < 3;i++) {
json_lucky_num["lucky_number"].append(6+i);
}
//添加lucky_number对象
json_person["others"].append(json_lucky_num);
//添加constellation对象
Json::Value json_constellation;
//创建constellation数组
json_constellation["constellation"].append("scorpio");
json_person["others"].append(json_constellation);
//向对象中添加数组
json_person["major"].append("engineer");
json_person["major"].append("singer");
//添加不含内容的空对象
json_person["others"].append(Json::objectValue);
//将person挂到根节点
root["person"] = json_person;
//将Json对象序列化为字符串
cout << root.toStyledString() << endl;
return 0;
}
输出结果:
{
"person" :
{
"age" : 2,
"height" : 1.74,
"hometown" :
[
{
"country" :
[
"guangzhou"
],
"province" :
[
"guangdong"
]
}
],
"major" :
[
"engineer",
"singer"
],
"name" : "pig",
"others" :
[
{
"lucky_number" :
[
6,
7,
8
]
},
{
"constellation" :
[
"scorpio"
]
},
{}
],
"sex" : "man",
"weight" : 70
}
}
三、小结
这是我参考其他文章得出来的创建一个json文件的基本用法,等有空了写下一篇读取文件的操作,这里难免会有一些错漏,如果发现了欢迎指出。
来源:oschina
链接:https://my.oschina.net/u/4302015/blog/4479417