文档参考:
详解JsonCpp库的使用Jsoncpp 使用方法大全

一、安装使用
sudo apt-get install libjsoncpp-dev

库的头文件安装在/usr/include/jsoncpp中, 库API文档默认在/usr/share/doc/
使用该库的方法很简单, 在程序中加入

#include <jsoncpp/json/json.h>

简单示例:

#include <iostream>
#include <fstream>
#include <jsoncpp/json/json.h>

using namespace std;

string WriteJson()
{
        Json::Value root;
        Json::Value array_data;

        Json::Value item;
        item["name"] = "zhangsan";
        item["age"] = 23;
        array_data.append(item);
        item["name"] = "lisi";
        item["age"] = 66;
        array_data.append(item);

        //增加对象数组
        root["array"] = array_data;
        //增加字符串
        root["name"]    = "json";
        //增加数字
        root["number"]    = 666;
        //增加布尔变量
        root["value"]    = true;

        // 将json转换为string类型
        return root.toStyledString();
}

void ReadJson(const string& strValue)
{
        Json::Reader reader;
        Json::Value root;
        if (!reader.parse(strValue,root))
        {
                cout <<"parse error" << endl;
                return ;
        }
        //解析json中的对象
        if(!root.isObject())
        {
                cout << "someone is not object!" << endl;
                return;
        }
        if(root["name"].isString())
        {
                string out = root["name"].asString();
                cout << "name :"  << out << endl;
        }
        if(root["number"].isInt())
        {
                cout << "number : " << root["number"].asInt() << endl;
        }
        if(root["value"].isBool())
        {
                cout << "value : "  << root["value"].asBool() << endl;
        }
        if(root["haha"].isNull())
        {
                cout << "no such num : " << root["haha"].asInt() << endl;
        }
        //解析对象数组对象
        if(root["array"].isArray())
        {
                Json::Value arrayObj = root["array"];
                cout << "array size = " << arrayObj.size() << endl;
                for(unsigned int i = 0; i < arrayObj.size(); i++)
                {
 						if(arrayObj[i].isMember("name"))
                        {
                                cout << "name:" << arrayObj[i]["name"].asString() << endl;
                        }
                }
        }
}
int main()
{
        Json::FastWriter writer;
        Json::Value null_value; // null
        Json::Value arr_value(Json::arrayValue); // []
        Json::Value obj_value(Json::objectValue); // {}
        //test null
        if(null_value.isNull())
        {
                cout << "someone is null!" << endl;
        }
        //test array
        if(arr_value.isArray())
        {
                cout << "someone is array!" << endl;
        }
 		//test object
        if(obj_value.isObject())
        {
                cout << "someone is object!" << endl;
        }

        string strJsonMsg = WriteJson();

        cout<< "strJsonMsg is: " << strJsonMsg << endl;
        ReadJson(strJsonMsg);
        return 0;


}

JAVA Json添加个数组对象_json

二、API接口学习

JSON是一个轻量级数据交换格式,其可读性好,数据量比XML格式小,被广泛作为网络传输的数据格式。

JsonCpp三个核心类Reader、FastWriter、Value基本可以满足项目对JSON构造解析的要求。

JAVA Json添加个数组对象_#include_02

2.1 类Reader

用来将JSON文件或者JSON格式的字符串解析为JSON的Value对象,其parse()接口第一个参数为JSON格式字符串,第二个参数是解析后Value对象,如果JSON格式正确将解析成功返回true。
接口原型:

//对json格式字符串解析
 bool parse( const std::string &document, Value &root, bool collectComments = true );
 bool parse( const char *beginDoc, const char *endDoc, Value &root, bool collectComments = true );
 //对json文件解析
 bool parse( std::istream &is, Value &root, bool collectComments = true );

现在假设有一个profile.json

{
"firstname":"paopao",
"lastname": "wang",
"tel": 12345678910
}

解析demo:

#include <iostream>
#include <fstream>
#include <jsoncpp/json/json.h>

using namespace std;

int ReadJsonFile()
{
        //Reader json file
        ifstream ifs("profile.json");
        Json::Reader reader;
        Json::Value obj;
        if(!reader.parse(ifs, obj)) {
                //fail to parse
                return -1;
        }
        else {
                cout << "Last name: " << obj["lastname"].asString() << endl;
                cout << "First name: " << obj["firstname"].asString() << endl;
        }

        return 0;
}

int ReadJsonStr()
{
        Json::Value root;
        Json::Reader reader;
        const char* s = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";
        if(!reader.parse(s, root)){
                cout << "parse fail" << endl;
        }
        else{
                std::cout << root["uploadid"].asString() << endl;//print "UP000000"
        }

        string str  = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";
        if(!reader.parse(str, root)){
                cout << "parse fail" << endl;
        }
        else{
                std::cout << root["uploadid"].asString() << endl;//print "UP000000"
        }

        return 0;
}
int main()
{
        ReadJsonFile();
        ReadJsonStr();
        return 0;
}
2.2 类Writer

Json::Writer 和 Json::Reader相反,是把Json::Value对象写到string对象中,而且Json::Writer是个抽象类,被两个子类Json::FastWriter和Json::StyledWriter继承。

JAVA Json添加个数组对象_JSON_03


简单来说FastWriter就是无格式的写入,这样的Json看起来很乱没有格式,而StyledWriter就是带有格式的写入,看起来会比较友好。

//fast write
        Json::FastWriter fwriter;
        std::string fast_str = fwriter.write(obj);
        cout << fast_str << endl;
        //style write(有格式)
        Json::StyledWriter swriter;
        std::string style_str = swriter.write(obj);
        cout << style_str << endl;
2.3 类Value

是JsonCpp库最为重要的类,它代表JSON格式字符串在内存中的状态,修改JSON格式字符串需先修改其Value对象,然后序列化输出,其提供四类接口:

第一, 判断类型,接口名字为isXXX(),其中XXX为类型,包括Bool、Int、Int64、UInt、UInt64、Double、String、Array、Object,与JSON格式的类型是对应的,isNull用来判断是否为空。

第二, 取值,接口名字为asXXX(),其中XXX与判断类型的接口一样,取值前务必先确保类型是对的,否则会抛出逻辑错误的异常。类型为Array的时候,size()接口获取Array的个数,然后遍历获取Array每个值(注意遍历时下标从0开始)。类型为Object的时候,isMember()接口用来判断对象是否有某个key,访问该key前务必先确保有该key,否则会抛出逻辑错误的异常,访问某个key时使用操作符[],参数为key值,有时候不知道对象都有哪些key,就得先调用getMemberNames()接口获取key列表(它是vector对象),然后遍历key列表逐个访问。

// 转换类型
Int asInt() const;
UInt asUInt() const;
Int64 asInt64() const;
UInt64 asUInt64() const;
LargestInt asLargestInt() const;
LargestUInt asLargestUInt() const;
float asFloat() const;
double asDouble() const;
bool asBool() const;
// 检测类型
bool isNull() const;
bool isBool() const;
bool isInt() const;
bool isInt64() const;
bool isUInt() const;
bool isUInt64() const;
bool isIntegral() const;
bool isDouble() const;
bool isNumeric() const;
bool isString() const;
bool isArray() const;
bool isObject() const;

第三, 新增/修改值,新增/修改值时使用操作符=,其参数为Value对象,Value类构造函数支持上面提到的所有类型,所以操作符=右侧可以直接使用上面提到的类型变量,无需转换。修改某个JSON值时,务必保证新旧的类型一致,否则会抛出逻辑错误的异常。Array时比较特殊,是调用append()接口追加,使用下标修改。

第四, 删除,Object时删除某个key使用removeMember()接口,Array时删除某个元素使用removeIndex接口指定元素的下标。

#include <stdio.h>
#include <string>
#include <jsoncpp/json/json.h>

using namespace std;

string ConstructJsonString()
{
    Json::Value rootValue = Json::objectValue;
    rootValue["encoding"] = "UTF-8";
    rootValue["plug-ins"] = Json::arrayValue;
    rootValue["plug-ins"].append("python");
    rootValue["plug-ins"].append("c++");
    rootValue["plug-ins"].append("ruby");
    rootValue["indent"] = Json::objectValue;
    rootValue["indent"]["length"] = 3;
    rootValue["indent"]["use_space"] = true;

    return Json::FastWriter().write(rootValue);
}
void ParseJsonString(const string& document)
{
    Json::Reader reader;
    Json::Value rootValue;
    if (!reader.parse(document, rootValue))
    {
        return;
    }

    if (!rootValue.isObject())
    {
        return;
    }

    if (rootValue.isMember("encoding") && rootValue["encoding"].isString())
    {
        printf("encoding is %s \n", rootValue["encoding"].asString().c_str());
    }

    if (rootValue.isMember("plug-ins") && rootValue["plug-ins"].isArray())
    {
        for (Json::ArrayIndex i = 0; i < rootValue["plug-ins"].size(); ++i)
        {
            if (rootValue["plug-ins"][i].isString())
 			{
                printf("plug-ins %d : %s \n", i, rootValue["plug-ins"][i].asString().c_str());
            }
        }
    }

    if (rootValue.isMember("indent") && rootValue["indent"].isObject())
    {
        if (rootValue["indent"].isMember("length") && rootValue["indent"]["length"].isInt())
        {
            printf("indent length is %d \n", rootValue["indent"]["length"].asInt());
        }

        if (rootValue["indent"].isMember("use_space") && rootValue["indent"]["use_space"].isBool())
        {
            printf("indent use_space is %s \n", rootValue["indent"]["use_space"].asBool() ? "true":"false");
        }
    }
}

int main(int argc, char* argv[])
{
    string document = ConstructJsonString();
    printf(document.c_str());
    printf("\n");
 	ParseJsonString(document);
    return 0;
}

输出:

JAVA Json添加个数组对象_#include_04