利用jsoncpp进行创建JSON

萝らか妹 提交于 2020-08-12 14:58:09

一、基本概念

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文件的基本用法,等有空了写下一篇读取文件的操作,这里难免会有一些错漏,如果发现了欢迎指出。

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!