Jsoncpp的使用

工程師WWW發表於2014-03-05

C++要使用JSON來解析資料,一般採用jsoncpp

網站:http://sourceforge.net/projects/jsoncpp/

下載了之後,解壓,然後開啟\jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\makefiles\vs71

下的工程檔案,進行編譯連結就可以得到一個靜態連結庫json.lib

要用jsoncpp只需要將這個lib檔案拷貝到你的工程目錄下,並將jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json

複製到工程目錄下,然後將這些標頭檔案加到工程中去就可以了。

例子:

{
"name" : "小樓一夜聽春雨",
"age" : 27
}

#pragma comment(lib, "json_mtd.lib")
 
#include <fstream>
#include <cassert>
#include "json/json.h"
 
int main()
{
    ifstream ifs;
    ifs.open("testjson.json");
    assert(ifs.is_open());
 
    Json::Reader reader;
    Json::Value root;
    if (!reader.parse(ifs, root, false))
    {
        return -1;
    }
 
    std::string name = root["name"].asString();
    int age = root["age"].asInt();
 
    std::cout<<name<<std::endl;
    std::cout<<age<<std::endl;
 
    return 0;
}

[{"name" : "xiaoy", "age" :17} , {"name" : "xiaot", "age" : 20}]

#pragma comment(lib, "json_mtd.lib")
 
#include <fstream>
#include <cassert>
#include "json/json.h"
 
int main()
{
    ifstream ifs;
    ifs.open("testjson.json");
    assert(ifs.is_open());
 
    Json::Reader reader;
    Json::Value root;
    if (!reader.parse(ifs, root, false))
    {
        return -1;
    }
 
    std::string name;
    int age;
    int size = root.size();
    for (int i=0; i<size; ++i)
    {
        name = root[i]["name"].asString();
        age = root[i]["age"].asInt();
 
        std::cout<<name<<" "<<age<<std::endl;
    }
 
    return 0;
}


json寫入:

#pragma comment(lib, "json_mtd.lib")
 
#include <fstream>
#include <cassert>
#include "json/json.h"
 
 
int main()
{
    Json::Value root;
    Json::FastWriter writer;
    Json::Value person;
 
    person["name"] = "hello world";
    person["age"] = 100;
    root.append(person);
 
    std::string json_file = writer.write(root);
 
 
    ofstream ofs;
    ofs.open("test1.json");
    assert(ofs.is_open());
    ofs<<json_file;
 
    return 0;
}


結果:[{"age":100,"name":"hello world"}]

 

json對陣列的解析還支援STL的風格。

Json::Value::Members member;//Members 這玩意就是vector<string>,typedef了而已
for (Json::Value::iterator itr = objArray.begin(); itr != objArray.end(); itr++)
{
member = (*itr).getMemberNames();
for (Json::Value::Members::iterator iter = member.begin(); iter != member.end(); iter++)
{
string str_temp = (*itr)[(*iter)].asString();
}
}

即此種風格與上面的類似,只是上面的只是取"text"節點,而後一種是輸出所有節點。