版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012750702/article/details/77432003
一、json格式简介
先看一个例子:
value 可为字符串、数字、集合,以及集合构成的数组。
先看一个例子:
{
"陕西": [
{ "编号":1, "城市": "西安", "电话区号":"029", "邮政编码": "710000" },
{ "编号":2, "城市": "汉中", "电话区号":"0916 ", "邮政编码": "723000" },
],
"四川": [
{ "编号":3, "城市": "成都", "电话区号":"028", "邮政编码": "610000" },
{ "编号":4, "城市": "绵阳", "电话区号":"0816 ", "邮政编码": "621000" },
{ "编号":5, "城市": "自贡", "电话区号":"0813", "邮政编码": "643000" }
],
"广东": [
{ "编号":6, "城市": "广州", "电话区号":"020", "邮政编码": "510000" },
{ "编号":7, "城市": "深圳", "电话区号":"0755 ", "邮政编码": "518000" },
{ "编号":8, "城市": "珠海", "电话区号":"0756", "邮政编码": "519000" }
]
}
json 数据格式中,最小单元是由格式为 {"key":value} 组成的键值对,多组键值对的可放在一个 {} 里用逗号隔开形成集合;value 可为字符串、数字、集合,以及集合构成的数组。
接下来我们照着这个例子来构造和解析。
二、构造
这里用的是c++ boost库,完整代码在后面。
//1
std::vector<std::pair<std::string, int> > number;
for(std::size_t i = 0; i < 8; ++i)
{
std::pair<std::string, int> num("Number", i+1);
number.push_back(num);
}
std::pair<std::string, std::string> city1("City", "Xi'an");
std::pair<std::string, std::string> city2("City", "Hanzhong");
std::pair<std::string, std::string> city3("City", "Chengdu");
std::pair<std::string, std::string> city4("City", "Mianyang");
std::pair<std::string, std::string> city5("City", "Zigong");
std::pair<std::string, std::string> city6("City", "Guangzhou");
std::pair<std::string, std::string> city7("City", "Shenzhen");
std::pair<std::string, std::string> city8("City", "Zhuhai");
std::pair<std::string, std::string> areacode1("The area code", "029");
std::pair<std::string, std::string> areacode2("The area code", "0916");
std::pair<std::string, std::string> areacode3("The area code", "028");
std::pair<std::string, std::string> areacode4("The area code", "0816");
std::pair<std::string, std::string> areacode5("The area code", "0813");
std::pair<std::string, std::string> areacode6("The area code", "020");
std::pair<std::string, std::string> areacode7("The area code", "0755");
std::pair<std::string, std::string> areacode8("The area code", "0756");
std::pair<std::string, std::string> postalcode1("Postalcode", "710000");
std::pair<std::string, std::string> postalcode2("Postalcode", "723000");
std::pair<std::string, std::string> postalcode3("Postalcode", "610000");
std::pair<std::string, std::string> postalcode4("Postalcode", "621000");
std::pair<std::string, std::string> postalcode5("Postalcode", "643000");
std::pair<std::string, std::string> postalcode6("Postalcode", "510000");
std::pair<std::string, std::string> postalcode7("Postalcode", "518000");
std::pair<std::string, std::string> postalcode8("Postalcode", "519000");
为了清楚,写的有些繁琐。2、做一个 {"城市": "西安"} 文件
//2
boost::property_tree::ptree pt_c1;
pt_c1.put(city1.first, city1.second);
std::stringstream ss_c1;
boost::property_tree::write_json(ss_c1, pt_c1);
std::string s_c1;
s_c1 = ss_c1.str();
std::ofstream out_c1;
out_c1.open("/out_c1.json");
if(!out_c1)
{
std::cout << "create out file failed !" << std::endl;
return 1;
}
out_c1 << s_c1;
out_c1.close();
参照前两行,直接将键值对数据 put() 进 ptree 类即可,输出时要转换成字符串输出,查看输出文件 "out_c1.json" 得到想要的结果:
{
"City": "Xi'an"
}
3、做一个 { "编号":1, "城市": "西安", "电话区号":"029", "邮政编码": "710000" } 文件
//3
boost::property_tree::ptree pt_assemblage1;
pt_assemblage1.put(number[0].first, 1);
pt_assemblage1.put(city1.first, city1.second);
pt_assemblage1.put(areacode1.first, areacode1.second);
pt_assemblage1.put(postalcode1.first, "000000");
pt_assemblage1.put(postalcode1.first, postalcode1.second);
参照代码前6行,直接将所有键值对数据依次 put() 进 ptree 类,形成一个含有4个键值对的集合,结果保存为 "/out_assemblage1.json" 文件:
{
"Number": "1",
"City": "Xi'an",
"The area code": "029",
"Postalcode": "710000"
}
这里需要注意的是我们在代码中 put() 了两遍邮政编码的键值对,但是只保存了一项,且数值是第二次添加的,相当于覆盖或修改了前一次添加结果。
4、{"陕西": [] }
4、{"陕西": [] }
//4
boost::property_tree::ptree p_array1;
p_array1.push_back(std::make_pair("", pt_assemblage1));
p_array1.push_back(std::make_pair("", pt_assemblage2));
boost::property_tree::ptree pt_province1;
pt_province1.add_child("Shannxi", p_array1);
代码前三行构造了一个数组,对应 [] 中的内容,将 3中完成的两个城市的集合,用 push_back() 函数组成一个数组,此函数输入是一个 pair 类型数据,若多次 push() 的 pair 数据的 key 相同且为空,则会组成现有的这个数组,否则会以键值对形式添加;
然后用 add_child() 函数将这个数组当作 value 与 "陕西" 这个 key 关联起来,并添加,结果保存为 "/out_province1.json" 文件:
然后用 add_child() 函数将这个数组当作 value 与 "陕西" 这个 key 关联起来,并添加,结果保存为 "/out_province1.json" 文件:
{
"Shannxi": [
{
"Number": "1",
"City": "Xi'an",
"The area code": "029",
"Postalcode": "710000"
},
{
"Number": "2",
"City": "Hanzhong",
"The area code": "0916",
"Postalcode": "723000"
}
]
}
5、最终结果
//5
boost::property_tree::ptree pt_all;
pt_all.add_child("Shannxi", p_array1);
pt_all.add_child("Sichuan", p_array2);
pt_all.add_child("Guangdong", p_array3);
同4,继续用 add_child() 函数添加完,结果保存为 "/out_all.json" 文件:
{
"Shannxi": [
{
"Number": "1",
"City": "Xi'an",
"The area code": "029",
"Postalcode": "710000"
},
{
"Number": "2",
"City": "Hanzhong",
"The area code": "0916",
"Postalcode": "723000"
}
],
"Sichuan": [
{
"Number": "3",
"City": "Chengdu",
"The area code": "028",
"Postalcode": "610000"
},
{
"Number": "4",
"City": "Mianyang",
"The area code": "0816",
"Postalcode": "621000"
},
{
"Number": "5",
"City": "Zigong",
"The area code": "0813",
"Postalcode": "643000"
}
],
"Guangdong": [
{
"Number": "6",
"City": "Guangzhou",
"The area code": "020",
"Postalcode": "510000"
},
{
"Number": "7",
"City": "Shenzhen",
"The area code": "0755",
"Postalcode": "518000"
},
{
"Number": "8",
"City": "Zhuhai",
"The area code": "0756",
"Postalcode": "519000"
}
]
}
6、继续组合
//6
boost::property_tree::ptree pt_more;
pt_more.add_child("1", pt_all);
pt_more.add_child("2", pt_all);
put() 函数用于将基本数据类型组合,而 add_child() 函数用于将 ptree 类当作 value 与 key 组合于是现有数据还可继续组合分别添加两个关键字1和2,保存为 “out_more.json” 文件:
{
"1": {
"Shannxi": [
{ "Number": "1", "City": "Xi'an", "The area code": "029", "Postalcode": "710000" },
{ "Number": "2", "City": "Hanzhong", "The area code": "0916", "Postalcode": "723000" }
],
"Sichuan": [
{ "Number": "3", "City": "Chengdu", "The area code": "028", "Postalcode": "610000" },
{ "Number": "4", "City": "Mianyang", "The area code": "0816", "Postalcode": "621000" },
{ "Number": "5", "City": "Zigong", "The area code": "0813", "Postalcode": "643000" }
],
"Guangdong": [
{ "Number": "6", "City": "Guangzhou", "The area code": "020", "Postalcode": "510000" },
{ "Number": "7", "City": "Shenzhen", "The area code": "0755", "Postalcode": "518000" },
{ "Number": "8", "City": "Zhuhai", "The area code": "0756", "Postalcode": "519000" }
]
},
"2": {
"Shannxi": [
{ "Number": "1", "City": "Xi'an", "The area code": "029", "Postalcode": "710000" },
{ "Number": "2", "City": "Hanzhong", "The area code": "0916", "Postalcode": "723000" }
],
"Sichuan": [
{ "Number": "3", "City": "Chengdu", "The area code": "028", "Postalcode": "610000" },
{ "Number": "4", "City": "Mianyang", "The area code": "0816", "Postalcode": "621000" },
{ "Number": "5", "City": "Zigong", "The area code": "0813", "Postalcode": "643000" }
],
"Guangdong": [
{ "Number": "6", "City": "Guangzhou", "The area code": "020", "Postalcode": "510000" },
{ "Number": "7", "City": "Shenzhen", "The area code": "0755", "Postalcode": "518000" },
{ "Number": "8", "City": "Zhuhai", "The area code": "0756", "Postalcode": "519000" }
]
}
}
完整代码:
#include <iostream>
#include <map>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
using namespace std;
int main(int argc, char *argv[])
{
//1
std::vector<std::pair<std::string, int> > number;
for(std::size_t i = 0; i < 8; ++i)
{
std::pair<std::string, int> num("Number", i+1);
number.push_back(num);
}
std::pair<std::string, std::string> city1("City", "Xi'an");
std::pair<std::string, std::string> city2("City", "Hanzhong");
std::pair<std::string, std::string> city3("City", "Chengdu");
std::pair<std::string, std::string> city4("City", "Mianyang");
std::pair<std::string, std::string> city5("City", "Zigong");
std::pair<std::string, std::string> city6("City", "Guangzhou");
std::pair<std::string, std::string> city7("City", "Shenzhen");
std::pair<std::string, std::string> city8("City", "Zhuhai");
std::pair<std::string, std::string> areacode1("The area code", "029");
std::pair<std::string, std::string> areacode2("The area code", "0916");
std::pair<std::string, std::string> areacode3("The area code", "028");
std::pair<std::string, std::string> areacode4("The area code", "0816");
std::pair<std::string, std::string> areacode5("The area code", "0813");
std::pair<std::string, std::string> areacode6("The area code", "020");
std::pair<std::string, std::string> areacode7("The area code", "0755");
std::pair<std::string, std::string> areacode8("The area code", "0756");
std::pair<std::string, std::string> postalcode1("Postalcode", "710000");
std::pair<std::string, std::string> postalcode2("Postalcode", "723000");
std::pair<std::string, std::string> postalcode3("Postalcode", "610000");
std::pair<std::string, std::string> postalcode4("Postalcode", "621000");
std::pair<std::string, std::string> postalcode5("Postalcode", "643000");
std::pair<std::string, std::string> postalcode6("Postalcode", "510000");
std::pair<std::string, std::string> postalcode7("Postalcode", "518000");
std::pair<std::string, std::string> postalcode8("Postalcode", "519000");
//2
boost::property_tree::ptree pt_c1;
pt_c1.put(city1.first, city1.second);
std::stringstream ss_c1;
boost::property_tree::write_json(ss_c1, pt_c1);
std::string s_c1;
s_c1 = ss_c1.str();
std::ofstream out_c1;
out_c1.open("/out_c1.json");
if(!out_c1)
{
std::cout << "create out file failed !" << std::endl;
return 1;
}
out_c1 << s_c1;
out_c1.close();
//3
boost::property_tree::ptree pt_assemblage1;
pt_assemblage1.put(number[0].first, 1);
pt_assemblage1.put(city1.first, city1.second);
pt_assemblage1.put(areacode1.first, areacode1.second);
pt_assemblage1.put(postalcode1.first, "000000");
pt_assemblage1.put(postalcode1.first, postalcode1.second);
std::stringstream ss_assemblage1;
boost::property_tree::write_json(ss_assemblage1, pt_assemblage1);
std::string s_assemblage1;
s_assemblage1 = ss_assemblage1.str();
std::ofstream out_assemblage1;
out_assemblage1.open("/out_assemblage1.json");
if(!out_assemblage1)
{
std::cout << "create out file failed !" << std::endl;
return 1;
}
out_assemblage1 << s_assemblage1;
out_assemblage1.close();
boost::property_tree::ptree pt_assemblage2;
pt_assemblage2.put(number[1].first, number[1].second);
pt_assemblage2.put(city2.first, city2.second);
pt_assemblage2.put(areacode2.first, areacode2.second);
pt_assemblage2.put(postalcode2.first, postalcode2.second);
boost::property_tree::ptree pt_assemblage3;
pt_assemblage3.put(number[2].first, number[2].second);
pt_assemblage3.put(city3.first, city3.second);
pt_assemblage3.put(areacode3.first, areacode3.second);
pt_assemblage3.put(postalcode3.first, postalcode3.second);
boost::property_tree::ptree pt_assemblage4;
pt_assemblage4.put(number[3].first, number[3].second);
pt_assemblage4.put(city4.first, city4.second);
pt_assemblage4.put(areacode4.first, areacode4.second);
pt_assemblage4.put(postalcode4.first, postalcode4.second);
boost::property_tree::ptree pt_assemblage5;
pt_assemblage5.put(number[4].first, number[4].second);
pt_assemblage5.put(city5.first, city5.second);
pt_assemblage5.put(areacode5.first, areacode5.second);
pt_assemblage5.put(postalcode5.first, postalcode5.second);
boost::property_tree::ptree pt_assemblage6;
pt_assemblage6.put(number[5].first, number[5].second);
pt_assemblage6.put(city6.first, city6.second);
pt_assemblage6.put(areacode6.first, areacode6.second);
pt_assemblage6.put(postalcode6.first, postalcode6.second);
boost::property_tree::ptree pt_assemblage7;
pt_assemblage7.put(number[6].first, number[6].second);
pt_assemblage7.put(city7.first, city7.second);
pt_assemblage7.put(areacode7.first, areacode7.second);
pt_assemblage7.put(postalcode7.first, postalcode7.second);
boost::property_tree::ptree pt_assemblage8;
pt_assemblage8.put(number[7].first, number[7].second);
pt_assemblage8.put(city8.first, city8.second);
pt_assemblage8.put(areacode8.first, areacode8.second);
pt_assemblage8.put(postalcode8.first, postalcode8.second);
//4
boost::property_tree::ptree p_array1;
p_array1.push_back(std::make_pair("", pt_assemblage1));
p_array1.push_back(std::make_pair("", pt_assemblage2));
boost::property_tree::ptree pt_province1;
pt_province1.add_child("Shannxi", p_array1);
std::stringstream ss_province1;
boost::property_tree::write_json(ss_province1, pt_province1);
std::string s_province1;
s_province1 = ss_province1.str();
std::ofstream out_province1;
out_province1.open("/out_province1.json");
if(!out_province1)
{
std::cout << "create out file failed !" << std::endl;
return 1;
}
out_province1 << s_province1;
out_province1.close();
boost::property_tree::ptree p_array2;
p_array2.push_back(std::make_pair("", pt_assemblage3));
p_array2.push_back(std::make_pair("", pt_assemblage4));
p_array2.push_back(std::make_pair("", pt_assemblage5));
boost::property_tree::ptree pt_province2;
pt_province2.add_child("Sichuan", p_array2);
boost::property_tree::ptree p_array3;
p_array3.push_back(std::make_pair("", pt_assemblage6));
p_array3.push_back(std::make_pair("", pt_assemblage7));
p_array3.push_back(std::make_pair("", pt_assemblage8));
boost::property_tree::ptree pt_province3;
pt_province3.add_child("Guangdong", p_array3);
boost::property_tree::ptree pt_all_array;
pt_all_array.push_back(std::make_pair("", pt_province1));
pt_all_array.push_back(std::make_pair("", pt_province2));
pt_all_array.push_back(std::make_pair("", pt_province3));
//5
boost::property_tree::ptree pt_all;
pt_all.add_child("Shannxi", p_array1);
pt_all.add_child("Sichuan", p_array2);
pt_all.add_child("Guangdong", p_array3);
std::stringstream ss_all;
boost::property_tree::write_json(ss_all, pt_all);
std::string s_all;
s_all = ss_all.str();
std::ofstream out_all;
out_all.open("/out_all.json");
if(!out_all)
{
std::cout << "create out file failed !" << std::endl;
return 1;
}
out_all << s_all;
out_all.close();
//6
boost::property_tree::ptree pt_more;
pt_more.add_child("1", pt_all);
pt_more.add_child("2", pt_all);
std::stringstream ss_more;
boost::property_tree::write_json(ss_more, pt_more);
std::string s_more;
s_more = ss_more.str();
std::ofstream out_more;
out_more.open("/out_more.json");
if(!out_more)
{
std::cout << "create out file failed !" << std::endl;
return 1;
}
out_more << s_more;
out_more.close();
return 0;
}
三、解析
(未完待续)