JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似。
Jsoncpp是个跨平台的开源库,下载地址:http://sourceforge.net/projects/jsoncpp/。
json中仅支持两种结构:
1)name->value键值对(pair)的集合,一般称为对象(object)。
2)值的有序表,一般称为数组(array)。
1:pair
先从键值对(pair)开始,一个pair的通常结是:string:value
键值之间的对应关系使用:
表示,左边的为name,右边的为value。
一般key使用字符串,当然也可以使用数字,但是不推荐。
value的取值就比较随便,可以是任何任何json支持的类型(比如object,array,string,number,true/false,null等)。
2. object
object可以认为是多个pair的集合,其语法是以{
作为object开始,以 }
作为object结束,不同的pair之间使用,
分割。需要说明的是object中的数据存储是无序的。下面是一个比较典型的object构成。
{
"name" : "tocy",
"age" : 1000
}
3. array
array是value的有序集合。其语法是以[
作为array起始,以]
作为array结束,array元素之间使用,
分割。实际使用中建议在array中使用统一的类型,否则解析起来会麻烦点。比如下面语法是合法的:
[{"name":"tocy"}, {"age":1000}, {"domain":"cn"}]
下面介绍一下具体的使用:
读json文件:文件名text.json,文件内容
[
{
"text": "请帮我显示地图",
"intent": "screen_transition_Map",
"intent_prediction": {
"name": "media_control_stop",
"confidence": 0.06185858448739933
}
},
{
"text": "打开音乐",
"intent": "media_control_play",
"intent_prediction": {
"name": "media_control_power_on",
"confidence": 0.3026158324053915
}
}
]
具体代码:
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <string>
#include "json/json.h"
using namespace std;
int main()
{
ifstream is("text.json", ios::binary);
if (!is.is_open()) {
cout << "open json file failed." << endl;
return -1;
}
Json::Reader reader;
Json::Value root;
string text;
string intent;//实际intent
string intent_prediction;//预测intent
string intent_prediction_name;//预测intent name
if (reader.parse(is, root)) {
int pSize = root.size();
printf("size: %d\n", pSize);
for (int i = 1; i < pSize; i++) {
intent = root[i]["intent"].asString();
text = root[i]["text"].asString();
Json::Value pSonroot = root[i]["intent_prediction"];
intent_prediction_name = pSonroot["name"].asString();
is.close();
}
}
return 0;
}
写json文件:
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <string>
#include "json/json.h"
using namespace std;
int main()
{
//写textJson文件
Json::StyledWriter writer;
Json::Value pResultroot;
ofstream os;
os.open("CompareResult.json");
//给textJson文件的text,intent,intent_prediction赋值
pResultroot["text"] = text;
pResultroot["intent"] = intent;
pResultroot["intent_prediction"] = intent_prediction_name;
Json::Value pAlltext;//pResultroot对象中又含有数组
int Rcount = 0;
for (int i = 0; i < 10; i++) {
pAlltext[Rcount++]["text"] = text;//这里的text是从某文件中取出的,我省略没写
}
pResultroot["4all_text"] = pAlltext;
os << writer.write(pResultroot);
os.close();
return 0;
}
输出结果:
{
"1text" : "打开音乐",
"2intent" : "media_control_play",
"3intent_prediction" : "media_control_power_on",
"4all_text" : [
{
"text" : "打开音乐"
},
{
"text" : "打开音频"
},
{
"text" : "来点音乐"
}
]
}