Json格式与C++构造解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012750702/article/details/77432003
一、json格式简介
  先看一个例子:
{ 
  "陕西": [ 
    { "编号":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、准备数据
    //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
    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" 文件:
{
    "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;
}


 
 三、解析
(未完待续)

猜你喜欢

转载自blog.csdn.net/u012750702/article/details/77432003