C++通过jsoncpp类库读写JSON文件

JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择。JSON的全称为:JavaScript Object Notation ,顾名思义,JSON是用于标记javascript对象的,详情参考http://www.json.org/。

本教程选择第三方库jsoncpp来解析json, jsoncpp是比较出名的c++解析库,在json官网也是首推的。

jsoncpp下载地址:http://download.csdn.net/detail/tennysonsky/

下载源码解压之后得到jsoncpp-src-0.5.0文件夹,我们只需要jsoncpp的头文件和cpp文件,其中jsonscpp的头文件位于jsoncpp-src-0.5.0\include\json,jsoncpp的cpp文件位于jsoncpp-src-0.5.0\src\lib_json。

json: json操作所需的头文件,此文件夹名字不能修改,因为lib_json目录中所对应的.cpp里面包含头文件形式是这样:#include <json/xxx.h>。

lib_json:json操作所需的cpp文件,此文件夹名字可根据需要自行命名。

把json和lib_json拷贝出来放在你需要编写代码的目录中(注意:json 和 lib_json 要在同一级目录):

编译代码时,需要把lib_json目录中的cpp文件加入编译条件中:

1)从字符串中读取JSON

#include <string>

#include <json/json.h>

#include <iostream>

#include <fstream>

using namespace std;



void readStrJson(); //从字符串中读取JSON

void readStrProJson(); //从字符串中读取JSON(内容复杂些)



int main(int argc, char *argv[]) 

{

        readStrJson();

 

        cout << "\n\n";

        readStrProJson();

 

        return 0;

}



//从字符串中读取JSON

void readStrJson() 

{

        //字符串

  const char* str = 

      "{\"praenomen\":\"Gaius\",\"nomen\":\"Julius\",\"cognomen\":\"Caezar\","

      "\"born\":-100,\"died\":-44}";

 

  /*

  //json内容如下:

  {

                "praenomen":"Gaius",

                "nomen":"Julius",

                "cognomen":"Caezar",

                "born":-100,

                "died":-44 

        }

  */



  Json::Reader reader;

  Json::Value root;



  //从字符串中读取数据

  if(reader.parse(str,root))

  {

      string praenomen = root["praenomen"].asString();

      string nomen = root["nomen"].asString();

      string cognomen = root["cognomen"].asString();

      int born = root["born"].asInt();

      int died = root["died"].asInt();



      cout << praenomen + " " + nomen + " " + cognomen

          << " was born in year " << born 

          << ", died in year " << died << endl;

  }

 

}



//从字符串中读取JSON(内容复杂些)

void readStrProJson() 

{

        string strValue = "{\"name\":\"json\",\"array\":[{\"cpp\":\"jsoncpp\"},{\"java\":\"jsoninjava\"},{\"php\":\"support\"}]}";

        /*

        //json内容如下:

        {

    "name": "json″,

    "array": [

        {

            "cpp": "jsoncpp"

        },

        {

            "java": "jsoninjava"

        },

        {

            "php": "support"

        }

    ]

        }

        */





        Json::Reader reader;

        Json::Value value;



        if (reader.parse(strValue, value))

        {

                string out = value["name"].asString();

                cout << out << endl;

                const Json::Value arrayObj = value["array"];

                for (unsigned int i = 0; i < arrayObj.size(); i++)

                {

                        if (!arrayObj[i].isMember("cpp")) 

                                continue;

                        out = arrayObj[i]["cpp"].asString();

                        cout << out;

                        if (i != (arrayObj.size() - 1))

                                cout << endl;

                }

        }

}

编译运行结果如下:

2)从文件中读取JSON


#include <string>

#include <json/json.h>

#include <iostream>

#include <fstream>

using namespace std;



void readFileJson(); //从文件中读取JSON,一个存储了JSON格式字符串的文件



int main(int argc, char *argv[]) 

{

        readFileJson();

 

        return 0;

}



//从文件中读取JSON

void readFileJson()

{

        Json::Reader reader;

        Json::Value root;



        //从文件中读取,保证当前文件有test.json文件

        ifstream in("test.json", ios::binary);

        //in.open("test.json", ios::binary);



        if( !in.is_open() )  

        { 

        cout << "Error opening file\n"; 

        return; 

        }



        /*

        //test.json内容如下:

        {

                "name":"Tsybius",

                "age":23,

                "sex_is_male":true,

                "partner":

                {

                        "partner_name":"Galatea",

                        "partner_age":21,

                        "partner_sex_is_male":false

                },

                "achievement":["ach1","ach2","ach3"]

        }

        */



        if(reader.parse(in,root))

        {

        //读取根节点信息

        string name = root["name"].asString();

        int age = root["age"].asInt();

        bool sex_is_male = root["sex_is_male"].asBool();



        cout << "My name is " << name << endl;

        cout << "I'm " << age << " years old" << endl;

        cout << "I'm a " << (sex_is_male ? "man" : "woman") << endl;



        //读取子节点信息

        string partner_name = root["partner"]["partner_name"].asString();

        int partner_age = root["partner"]["partner_age"].asInt();

        bool partner_sex_is_male = root["partner"]["partner_sex_is_male"].asBool();



        cout << "My partner's name is " << partner_name << endl;

        cout << (partner_sex_is_male ? "he" : "she") << " is "

                << partner_age << " years old" << endl;



        //读取数组信息

        cout << "Here's my achievements:" << endl;

        for(unsigned int i = 0; i < root["achievement"].size(); i++)

        {

                string ach = root["achievement"][i].asString();

                cout << ach << '\t';

        }

        cout << endl;



        cout << "Reading Complete!" << endl;

        }

        else

        {

        cout << "parse error\n" << endl;        

        }



        in.close();

}

test.json文件内容如下:

{

        "name":"Mike Jiang",

        "age":23,

        "sex_is_male":true,

        "partner":

        {

            "partner_name":"Galatea",

            "partner_age":21,

            "partner_sex_is_male":false

        },

        "achievement":["ach1","ach2","ach3"]

}

3)将信息保存为JSON格式

#include <string>

#include <json/json.h>

#include <iostream>

#include <fstream>

using namespace std;



void writeFileJson();//将信息保存为JSON格式



int main(int argc, char *argv[]) 

{

        writeFileJson();

 

        return 0;

}



//将信息保存为JSON格式

void writeFileJson()

{

        //根节点

        Json::Value root;

 

        //根节点属性

        root["name"] = Json::Value("Mike Jiang");

        root["age"] = Json::Value(23);

        root["sex_is_male"] = Json::Value(true);

 

        //子节点

        Json::Value partner;

 

        //子节点属性

        partner["partner_name"] = Json::Value("Galatea");

        partner["partner_age"] = Json::Value(21);

        partner["partner_sex_is_male"] = Json::Value(false);

 

        //子节点挂到根节点上

        root["partner"] = Json::Value(partner);

 

        //数组形式

        root["achievement"].append("ach1");

        root["achievement"].append("ach2");

        root["achievement"].append("ach3");

 

        //直接输出

        cout << "FastWriter:" << endl;

        Json::FastWriter fw;

        cout << fw.write(root) << endl << endl;

 

        //缩进输出

        cout << "StyledWriter:" << endl;

        Json::StyledWriter sw;

        cout << sw.write(root) << endl << endl;

 

        //输出到文件

        ofstream os;

        os.open("demo.json");

        os << sw.write(root);

        os.close();

 

        /*

        //json文件内容如下:

        {

                "achievement" : [ "ach1", "ach2", "ach3" ],

                "age" : 23,

                "name" : "Mike Jiang",

                "partner" : {

                        "partner_age" : 21,

                        "partner_name" : "Galatea",

                        "partner_sex_is_male" : false

                },

                "sex_is_male" : true

        }

        */



}
 
编译运行结果如下: 

生成的demo.json文件内容如下:

//1
//从字符串中读取

#include <string>
#include "json/json.h"
#include <iostream>
#include <fstream>

using namespace std;

void readStrJson(); //从字符串中读取JSON
void readStrProJson(); //从字符串中读取JSON(内容复杂些)

int main01(int argc, char *argv[]) 
{
        readStrJson();
        
        cout << "\n\n";
        readStrProJson();
        
        system("pause");
        return 0;
}

//从字符串中读取JSON
void readStrJson() 
{
        //字符串
  const char* str = 
      "{\"praenomen\":\"Gaius\",\"nomen\":\"Julius\",\"cognomen\":\"Caezar\","
      "\"born\":-100,\"died\":-44}";
      
  /*
  //json内容如下:
  {
                "praenomen":"Gaius",
                "nomen":"Julius",
                "cognomen":"Caezar",
                "born":-100,
                "died":-44 
        }
  */

  Json::Reader reader;
  Json::Value root;

  //从字符串中读取数据
  if(reader.parse(str,root))
  {
      string praenomen = root["praenomen"].asString();
      string nomen = root["nomen"].asString();
      string cognomen = root["cognomen"].asString();
      int born = root["born"].asInt();
      int died = root["died"].asInt();

      cout << praenomen + " " + nomen + " " + cognomen
          << " was born in year " << born 
          << ", died in year " << died << endl;
  }
  
}

//从字符串中读取JSON(内容复杂些)
void readStrProJson() 
{
        string strValue = "{\"name\":\"json\",\"array\":[{\"cpp\":\"jsoncpp\"},{\"java\":\"jsoninjava\"},{\"php\":\"support\"}]}";
        /*
        //json内容如下:
        {
    "name": "json″,
    "array": [
        {
            "cpp": "jsoncpp"
        },
        {
            "java": "jsoninjava"
        },
        {
            "php": "support"
        }
    ]
        }
        */


        Json::Reader reader;
        Json::Value value;

        if (reader.parse(strValue, value))
        {
                string out = value["name"].asString();
                cout << out << endl;
                const Json::Value arrayObj = value["array"];
                for (unsigned int i = 0; i < arrayObj.size(); i++)
                {
                        if (!arrayObj[i].isMember("cpp")) 
                                continue;
                        out = arrayObj[i]["cpp"].asString();
                        cout << out;
                        if (i != (arrayObj.size() - 1))
                                cout << endl;
                }
        }
}






//2
//从文件中读取


void readFileJson(); //从文件中读取JSON,一个存储了JSON格式字符串的文件

int main02(int argc, char *argv[]) 
{
        readFileJson();
        
        return 0;
}

//从文件中读取JSON
void readFileJson()
{
        Json::Reader reader;
        Json::Value root;

        //从文件中读取,保证当前文件有test.json文件
        ifstream in("D:/test.json", ios::binary);
        //in.open("test.json", ios::binary);

        if( !in.is_open() )  
        { 
        cout << "Error opening file\n"; 
        return; 
        }

        /*
        //test.json内容如下:
        {
                "name":"Tsybius",
                "age":23,
                "sex_is_male":true,
                "partner":
                {
                        "partner_name":"Galatea",
                        "partner_age":21,
                        "partner_sex_is_male":false
                },
                "achievement":["ach1","ach2","ach3"]
        }
        */

        if(reader.parse(in,root))
        {
        //读取根节点信息
        string name = root["name"].asString();
        int age = root["age"].asInt();
        bool sex_is_male = root["sex_is_male"].asBool();

        cout << "My name is " << name << endl;
        cout << "I'm " << age << " years old" << endl;
        cout << "I'm a " << (sex_is_male ? "man" : "woman") << endl;

        //读取子节点信息
        string partner_name = root["partner"]["partner_name"].asString();
        int partner_age = root["partner"]["partner_age"].asInt();
        bool partner_sex_is_male = root["partner"]["partner_sex_is_male"].asBool();

        cout << "My partner's name is " << partner_name << endl;
        cout << (partner_sex_is_male ? "he" : "she") << " is "
                << partner_age << " years old" << endl;

        //读取数组信息
        cout << "Here's my achievements:" << endl;
        for(unsigned int i = 0; i < root["achievement"].size(); i++)
        {
                string ach = root["achievement"][i].asString();
                cout << ach << '\t';
        }
        cout << endl;

        cout << "Reading Complete!" << endl;
        }
        else
        {
        cout << "parse error\n" << endl;        
        }

        in.close();
}



//3
//保存为json格式


void writeFileJson();//将信息保存为JSON格式

int main03(int argc, char *argv[]) 
{
        writeFileJson();
        
        return 0;
}

//将信息保存为JSON格式
void writeFileJson()
{
        //根节点
        Json::Value root;
        
        //根节点属性
        root["name"] = Json::Value("Mike Jiang");
        root["age"] = Json::Value(23);
        root["sex_is_male"] = Json::Value(true);
        
        //子节点
        Json::Value partner;
        
        //子节点属性
        partner["partner_name"] = Json::Value("Galatea");
        partner["partner_age"] = Json::Value(21);
        partner["partner_sex_is_male"] = Json::Value(false);
        
        //子节点挂到根节点上
        root["partner"] = Json::Value(partner);
        
        //数组形式
        root["achievement"].append("ach1");
        root["achievement"].append("ach2");
        root["achievement"].append("ach3");
        
        //直接输出
        cout << "FastWriter:" << endl;
        Json::FastWriter fw;
        cout << fw.write(root) << endl << endl;
        
        //缩进输出
        cout << "StyledWriter:" << endl;
        Json::StyledWriter sw;
        cout << sw.write(root) << endl << endl;
        
        //输出到文件
        ofstream os;
        os.open("demo.json");
        os << sw.write(root);
        os.close();
        
        /*
        //json文件内容如下:
        {
                "achievement" : [ "ach1", "ach2", "ach3" ],
                "age" : 23,
                "name" : "Mike Jiang",
                "partner" : {
                        "partner_age" : 21,
                        "partner_name" : "Galatea",
                        "partner_sex_is_male" : false
                },
                "sex_is_male" : true
        }
        */

}


void main()
{
    ifstream in("D://test.json",ios::binary);
    if(!in.is_open()) return;
    Json::Reader reader;
    Json::Value root;
    if(reader.parse(in,root))
    {
        /*
            {
                "json":"jsontest",
                    "name":"gongluck",
                    "birthday":
                {
                    "year":"1993",
                        "mon":"11",
                        "day":"02"
                },
                "job":[
                    {"first":"coder"},
                    {"second":"doter"},
                    {
                        "third":"loser",
                            "fourth":"winner"
                    }
                ]
            }
        */
        cout <<"json : " <<root["json"].asString() << endl;
        cout << "name : " << root["name"].asString()<<endl;
        cout << "birthday : " <<
            root["birthday"]["year"].asString() << "-"<<
            root["birthday"]["mon"].asString() << "-"<<
            root["birthday"]["day"].asString() <<endl;

        cout << "job : " <<endl;
        cout << root["job"][0u]["first"].asString()<<","<<
                      root["job"][1]["second"].asString()<<","<<
                      root["job"][2]["third"].asString()<<","<<
                      root["job"][2]["fourth"].asString()<<endl;

//         const Json::Value array = root["job"];
//         for (unsigned int i = 0; i < array.size(); i++)
//         {
//             if (!array[i].isMember("first"))
//                 continue;
//             cout << array[i]["first"].asString();
//        
    }

    system("pause");
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

聊一聊生产环境中如何动态监听配置文件变化并重载

上一篇,我们谈到Java中的几种读取properties配置文件的方式,但是在生产环境中,最忌讳的就是重启应用了。比如某个系统的路径常量或者接口变更,需要线上及...

32111
来自专栏后端之路

J2Cache实现分析之缓存过期

今天写一下两级缓存具体的实现 关于两级缓存的说明 两级缓存的概念很容易理解了,也是分布式环境下效率和正确性权衡后的结果。 考虑一下如果自己实现两级缓存的话需要...

5035
来自专栏Golang语言社区

厚土Go学习笔记 | 32. Readers读取数据流

go语言的 io 包指定了 io.Reader 接口。go语言标准库包含了这个接口的许多实现,包括文件、网络连接、压缩、加密等等。 io.Reader 接口有一...

3489
来自专栏行者常至

(17)Struts2_异常处理: exception-mapping 元素

322
来自专栏源哥的专栏

XML文件解析

在现在很多采用java开发的基于b/s结构的系统中,经常将一些配置参加放到一个xml文件中,然后在这个文件中取参数,这样减少了hard code的情况。下面这个...

472
来自专栏Albert陈凯

Hadoop数据分析平台实战——140Hive函数以及自定义函数讲解离线数据分析平台实战——140Hive函数以及自定义函数讲解

离线数据分析平台实战——140Hive函数以及自定义函数讲解 Hive函数介绍 HQL内嵌函数只有195个函数(包括操作符,使用命令show functions...

2698
来自专栏闵开慧

hadoop源码解析2 - conf包中Configuration.java解析

1 Hadoop Configuration简介     Hadoop没有使用java.util.Properties管理配置文件,也没有使用Apache Ja...

3238
来自专栏爱撒谎的男孩

用户管理模块之用户注册

2475
来自专栏java工会

Java爬虫Get校花网所有美女图片

1889
来自专栏跟着阿笨一起玩NET

关于DevExpress的XtraTreeList使用方法总结

521

扫描关注云+社区