【C++】jsoncpp的安装与使用

北城余情 提交于 2020-12-07 17:59:56

一、JSON的简单介绍

JSON(JavaScript Object Notation):JS对象表示法

是轻量级的文本数据交换格式;独立于语言,JSON解析器和库支持多种编程语言

json文件的文件类型是”.json”

语法规则:

  1. 数据在 名称/值对 中
    名称在双引号中,后面写一个冒号,然后是值
    值可以是:数字(整数或者浮点数)、string(在双引号中)、逻辑值(true/false)、数组(在[]中)、对象(在花括号中)、null,这些结构可以嵌套。

    eg.数组:
    {
        "people":
                    [ 
                    {
        
        "firstname":"jr","lastname":"smith"},
                    {
        
        "firstname":"palu","lastname":"george"}
                    ]
    }  
    对象people包含两个对象的数组,每个对象是某人的姓和名,people[0].lastname返回smith
  2. 数据由逗号分隔

  3. 花括号保存对象

  4. 方括号保存数组

二、jsoncpp的安装与测试

安装:

  1. 下载jsoncpp源码
    http://sourceforge.net/projects/jsoncpp/files/
  2. 解压jsoncpp到/opt/json下
    tar -zvxf jsoncpp-src-0.5.0.tar.gz -C /opt/json
    3.下载完后阅读README,发现需要用Scons来构建,关于Scons的介绍参考:http://os.51cto.com/art/201104/257443.htm,那么就下载Scons吧

  3. 下载Scons
    http://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.tar.gz/download
  4. 解压Scons到/opt/json下
    tar -zvxf scons-2.1.0.tar.gz -C /opt/json
  5. 进入scons-2.1.0目录下,执行以下命令
    sudo python setup.py install
  6. 进入jsoncpp-src-0.5.0 目录下,执行
    sudo scons platform=linux-gcc
  7. 将/jsoncpp-src-0.5.0/include/目录下的json文件夹拷贝到/usr/include/
  8. 将jsoncpp-src-0.5.0/libs/linux-gcc-4.9.1/目录下的libjson_linux-gcc-4.9.1_libmt.a 拷贝到/usr/local/lib/下,并为了方便使用,将其重命名为libjson.a

三、jsoncpp源码及函数接口的简单分析

装好之后。先来写个代码跑一下吧。

/*************************************************************************
    > File Name: test.cpp
    > Author: Tanswer_
    > Mail: 98duxm@gmail.com
    > Created Time: 2017年05月30日 星期二 11时50分09秒
 ************************************************************************/

#include <iostream>
#include <string>
#include <stack>
#include <algorithm>
#include <json/json.h>

using namespace std;

int main()
{
    string test="{\"id\":1,\"name\":\"test\"}";
    Json::Reader  reader;
    Json::Value   value;

    if(reader.parse(test,value))
    {
   
   
        if(!value["id"].isNull())
        {
   
   
            cout<<value["id"].asInt()<<endl;
            cout<<value["name"].asString()<<endl;
        }
    }
    return 0;
}

编译运行:

这里写图片描述


工作目录:

jsoncpp/           //工作目录
|-- include        //头文件根目录
|  |-- json       //json头文件,对应jsoncpp-src-0.5.0\include\json
|-- src            //cpp源码文件根目录
  |-- json       //jsoncpp源码文件,对应jsoncpp-src-0.5.0\src\lib_json
  |-- main.cpp   //我们的主函数,调用jsoncpp的示例代码,对应于jsoncpp-src-0.5.0/src/jsontestrunner

|-- makefile       //makefile

jsoncpp 中所有对象、类名都在namespace json中,#include<json/json.h>包含json.h即可

主要包含三种类:Value、Reader、Writer

  1. Json::Value类:可表示所有json支持的类型,如 int、string、object 等
  2. Json::Reader类:将json文件流或字符串解析到 Json::Value 中,主要使用 parse 函数
  3. Json::Writer类:将 Json::Value 转换为字符串流,是一个纯虚类,并不能直接使用,主要使用它的子类:Json::FastWriter—-输出不带格式的json、Json::StyledWriter—输出带格式的json、Json::StyledStreamWriter

Value

Json::Value 是jsoncpp中最基本、最重要的类,用于表示各种类型的对象。其中jsoncpp中的数组同JS一样,可以表示任意类型的值。

/*************************************************************************
    > File Name: value.cpp
    > Author: Tanswer_
    > Mail: duxm@xiyoulinux.org
    > Created Time: 2017年06月12日 星期一 19时02分57秒
 ************************************************************************/

#include <iostream>
#include <string>
#include <stack>
#include <queue>
#include <algorithm>
#include <vector>
#include <json/json.h>

using namespace std;


int main()
{
    Json::Value temp; //临时对象
    temp["name"] = "temp";
    temp["age"] = 20;

    Json::Value root;   //表示整个json对象

    //插入一个key名为key_string,value为"value_string"
    root["key_string"] = "value_string"; 

    //插入一个key名为key_int,value为12345
    root["key_int"] = 12345;

    //插入一个key名为key_boolean,value为false
    root["key_boolean"] = false;

    //插入一个key名为key_double,value为12.345
    root["key_double"] = 12.345;

    //插入一个key名为key_object,value为temp
    root["key_object"] = temp;

    /*插入一个key名为key_array,
    **是个数组,value为"value_string" 和 12345
    */
    root["key_array"].append("array_string");
    root["key_array"].append(12345);

    /*转换为json格式的字符串*/
    string out = root.toStyledString();
    /*输出*/
    cout << out << endl;
    return 0;
}

运行结果:

这里写图片描述

也可以看到插入数据的顺序和在json对象中相反。以上基本满足大部分的使用了,当然还用其他用法。

Writer

查看json的内容,就用到Writer类。上面也提到了Json::Writer是个纯虚类,并不能直接使用,我们使用它的子类:Json::FastWriter、Json::StyledWriter和Json::StyledStreamWriter

  • Json::FastWriter–处理json最快的,无格式输出

    比如我们把上面例子用这种方式输出:

    Json::FastWriter fast_writer;
    cout << fast_writer.write(root) << endl;

我们可以看到是没有格式的:

这里写图片描述


  • Json::StyledWriter 格式化输出json

    上面也用到了,还有一种写法:

    /*格式输出*/
    Json::StyledWriter styled_writer;
    cout << styled_writer.write(root) << endl;

这里写图片描述

Json::Reader

Json::Reader 是用来读取的,就是将 json 字符串转化为 Json::Value 对象的。

/*************************************************************************
    > File Name: parsefromstring.cpp
    > Author: Tanswer_
    > Mail: duxm@xiyoulinux.org
    > Created Time: 2017年06月12日 星期一 11时26分31秒
 ************************************************************************/

#include <iostream>
#include <string>
#include <stack>
#include <queue>
#include <algorithm>
#include <vector>
#include <json/json.h>

using namespace std;

/*解析json字符串*/
void parsefromstring(const string& str)
{
    Json::Value root;
    Json::Reader reader;

    /*root中将包含json字符串str中所有元素*/
    if(reader.parse(str,root))
    {
   
     
        cout << "name: " << root["name"].asString() << endl;
        cout << "age: " << root["age"].asInt() << endl;
        cout << "number: " << root["number"].asString() << endl; 
    }

}
int main()
{
    string str = " { \"name\":\"孟哥\",\"age\":88,\"number\":\"04150001\" } ";
    parsefromstring(str);


    return 0;
}

运行结果为:

这里写图片描述

已经解析出json串。

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