一、JSON简介
JSON
一种轻量级的数据交换格式,易于阅读、编写、解析,全称为JavsScript ObjectNotation。
JSON由两种基本结构组成
① 名字/值 对的集合,可以理解为对象
② 值的组合, 可以理解为数组
示例
string strTemp =
"{ "name" : "cuihao" ,"
" "age" : 28 }";
string strRoot =
"{ "key_string" : "value_string", "
" "key_number" : 28, "
" "key_boolean" : false, "
" "key_double" : 12.345, "
" "key_object" : json_temp, "
" "key_array" : ["array_string1", "array_string2", 12345]}";
二、JSONCPP
1. JsonCPP简介
jsoncpp是c++解析JSON串常用的解析库之一。其常用的类有:
a) Json::Value 可以表示里所有的类型,比如int,string,object,array等,其支持的类型可以参考Json:ValueType中的值。
b) Json::Reader 将json文件流或字符串解析到Json::Value,主要函数有Parse。
c) Json::Writer 与Json::Reader相反,将Json::Value转化成字符串流,注意它的两个子类:Json::FastWriter和Json::StyleWriter,分别输出不带格式的json和带格式的json。
d) Json::Value::Members主要用于以STL风格解析JSON数组。看过源代码的人已知道,Members其实是typedefvector而已。
在VC中使用JSONCPP
下载源码后,进入D:SourceSoftwarejsoncpp-src-0.5.0jsoncpp-src-0.5.0makefilesvs71类似目录用VS打开.sln文件进行编译。
注意:
Debug下可以直接编译
Release下:将lib_json项目属性:配置属性—C/C++--输出文件:汇编输出选择【无列表】,应为为No List。
使用JSONCPP时,添加
头文件目录:D:SourceSoftwarejsoncpp-src-0.5.0jsoncpp-src-0.5.0include
库目录:
Debug: D:SourceSoftwarejsoncpp-src-0.5.0jsoncpp-src-0.5.0uildvs71debuglib_json
#pragma commebt(lib, “json_vc71_libmtd.lib”) 对应/MDd
Release: D:SourceSoftwarejsoncpp-src-0.5.0jsoncpp-src-0.5.0uildvs71 eleaselib_json
#pragma commebt(lib, “json_vc71_libmt.lib”) 对应/MT
三、上代码
#include "stdafx.h"
#include <iostream>
#include <string>
#include <jsonjson.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string strStudent = "{ "name" : "cuishihao", "age" : 28, "major" : "cs" }";
//char* strStudent = "{ "name" : "cuishihao", "age" : 28, "major" : "cs" }";
Json::Reader reader;
Json::Value value;
bool bRet = reader.parse(strStudent, value);
if (false == bRet)
{
cerr << endl << "read value error
";
return -1;
}
cout << value["name"].asString()<<endl;
cout << value["age"].asInt()<<endl;
cout << value["major"].asString()<<endl;
cout << endl;
Json::Value json_temp;
json_temp["name"] = Json::Value("cuihao");
json_temp["age"] = Json::Value(28);
Json::Value root;
root["key_string"] = Json::Value("value_string");
root["key_number"] = Json::Value(12345);
root["key_boolean"] = Json::Value(true);
root["key_double"] = Json::Value(12.345);
root["key_object"] = json_temp;
root["key_array"].append("array_string1");
root["key_array"].append("array_string2");
root["key_array"].append(12345);
Json::ValueType type = root.type();
Json::Value arrValue = root["key_array"];
for (Json::Value::UInt i = 0; i < arrValue.size(); ++ i)
{
if (arrValue[i].isString())
cout << arrValue[i].asString();
else if (arrValue[i].isInt())
cout << arrValue[i].asInt();
cout << endl;
}
cout << endl << "----------------------------------- " <<endl;
string strTemp =
"{ "name" : "cuihao" ,"
" "age" : 28 }";
string strRoot =
"{ "key_string" : "value_string", "
" "key_number" : 28, "
" "key_boolean" : false, "
" "key_double" : 12.345, "
" "key_object" : json_temp, "
" "key_array" : ["array_string1", "array_string2", 12345]}";
Json::StyledWriter writer;
cout << endl << writer.write(root) << endl;
cout << endl << "----------------------------"<<endl;
Json::Value::Members members = root.getMemberNames();
for(Json::Value::Members::const_iterator iter = members.begin();
iter != members.end();
++ iter)
{
string strName = *iter;
if (root[strName].isInt())
cout << root[strName].asInt();
else if (root[strName].isString())
cout << root[strName].asString();
else if (root[strName].isDouble())
cout << root[strName].asDouble();
else if(root[strName].isBool())
cout << root[strName].asBool();
else if(root[strName].isArray())
{
for(Json::Value::ArrayIndex i = 0; i < root[strName].size(); ++ i)
{
if(root[strName][i].isInt())
cout << root[strName][i].asInt();
else if(root[strName][i].isString())
cout << root[strName][i].asString();
else
cout << "others";
cout << endl;
}
}
else if (root[strName].isObject())
{
Json::Value::Members mbs = root[strName].getMemberNames();
for (Json::Value::Members::const_iterator iter2 = mbs.begin();
iter2 != mbs.end();
++ iter2)
{
string strName2 = *iter2;
if(root[strName][strName2].isInt())
cout << root[strName][strName2].asInt();
else if(root[strName][strName2].isString())
cout << root[strName][strName2].asString();
else
cout << "others";
cout << endl;
} //for
} //else if
else
cout << "others";
cout << endl;
}
return 0;
}
执行结果