jsoncpp
目录
json介绍官网:http://www.json.org/json-zh.html
jsoncpp简介:
解析json
jsoncpp官网:
https://sourceforge.net/projects/jsoncpp/
json接口说明:
http://jsoncpp.sourceforge.net/annotated.html
jsoncpp库安装:
sudo apt-get install libjsoncpp-dev
Jsoncpp库测试:
#include <jsoncpp/json/reader.h>
#include <jsoncpp/json/json.h>
#include <string>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
using namespace std;
int main()
{
Json::FastWriter Writer;
Json::Value value;
string str;
//添加键值对
value["data"] = "hello world";
value["time"] = "2021.1.1";
value["SN"] = 12345;
str.clear();
//json值对象转化为json字符串
str = Writer.write(value);
printf("json:%s\r\n",str.c_str());
return 0;
}
编译(添加 -ljsoncpp 选项):
g++ -o simple simple.cpp -ljsoncpp
json语法基础介绍:
json介绍官网:
http://www.json.org/json-zh.html
JSON 语法规则:
json对象通过{}标识。
对象中包含的数据,通过键值对表示,键是所属的名称,键(key)也称属性。
数据之间由逗号分隔。
中括号 [] 保存数组,数组是值的集合。
JSON的数值:
数组 是值的有序的集合,同一种类型,[]标识,值之间用逗号隔开
JSON的值:
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
数组(在中括号中)
对象(在大括号中)
null
JSON书写格式:
JSON 名称/值对,JSON 数据的书写格式是: key : value 。键(key),通过双引号包含。
jsoncpp核心类:
Json::Value Value类是json的一个值对象,可以代表一个Json文档,也可以是键值对(key:value)中的value
Json::Writer 将Json文档转化为Json值对象,一个基类。但不能使用,而是使用FastWriter等子类。
Json::Reader 将Json值对象转化为Json文档
jsoncpp 解析json:
1.jsoncpp可以用如下判断对应值类型。
bool isNull () const | nullValue | 'null' value |
bool isInt () const | intValue | signed integer value |
bool isDouble () const | realValue | double value |
bool isString () const | stringValue | UTF-8 string value. |
bool isArray () const | arrayValue | array value (ordered list) |
bool isObject () const | objectValue | object value (collection of name/value pairs).(键值对集合,{ }类型) |
2.解析遍历json
分别对不同类型json的值处理
{
"datas1" : [
"name" ,
"age" ,
"heigth" ,
"weigth"
],
"datas2" : [
1,2,3,4
],
"datas3" : [
[11,22,33]
],
"datas4" : [
{"11":11,"22": 22,"33":33}
],
"total" : 123,
"description" : "hello world",
"status" : false,
"double" : 123.123,
"reserve":
{
"data" : "wwweeeerrrrttreee",
"len" : 12
}
}
#include <jsoncpp/json/reader.h>
#include <jsoncpp/json/json.h>
#include <string>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fstream>
#define JSON_PATH "./test.json"
void ParseObject(Json::Value &value);
void ParseArray(Json::Value &value);
using namespace std;
int main()
{
Json::FastWriter Writer;
Json::Value value;
Json::Reader reader;
ifstream ifs;
ifs.open(JSON_PATH,std::ifstream::in);
if(!ifs.good())
{
return -1;
}
if(reader.parse(ifs,value))
{
ParseObject(value);
}
ifs.close();
return 0;
}
void ParseObject(Json::Value &value)
{
Json::Value::Members names = value.getMemberNames(); //获取名字集合
Json::Value::Members child_names;
Json::Value child_value;
cout << "{" << endl;
for(int i = 0 ; i < names.size(); i++ )
{
if(value[names[i]].isNull())
{
continue;
}
else if(value[names[i]].isBool()) //bool类型
{
cout << names[i] << ":" << value[names[i]].asString() << endl;
}
if(value[names[i]].isInt()) //整数
{
cout << names[i] << ":" << value[names[i]].asInt() << endl;
}
else if(value[names[i]].isDouble()) //双精度
{
cout << names[i] << ":" << value[names[i]].asDouble() << endl;
}
else if(value[names[i]].isString()) //字符串
{
cout << names[i] << ":" << value[names[i]].asString() << endl;
}
else if(value[names[i]].isObject()) //对象
{
cout << names[i] << ":" ;
cout << "{" << endl;
ParseObject(value[names[i]]);
cout << "}"<< endl;
}
else if(value[names[i]].isArray())
{
cout << names[i] << ":" ;
ParseArray(value[names[i]]);
}
else
{
break;
}
}
cout << "}"<< endl;
return;
}
void ParseArray(Json::Value &value)
{
if(value.isArray()) // 数组 有序的集合,同一种类型
{ //值是对象 ,数组 ,键/对象
cout << "[" <<endl;
Json::Value child_value = value;
for(Json::Value::iterator itor = child_value.begin();itor != child_value.end(); itor++)
{
if((*itor).isNull())
{
continue;
}
else if((*itor).isBool()) //bool类型
{
cout << (*itor).asString() << endl;
}
if((*itor).isInt()) //整数
{
cout << (*itor).asInt() << endl;
}
else if((*itor).isDouble()) //双精度
{
cout << (*itor).asDouble() << endl;
}
else if((*itor).isString()) //字符串
{
cout << (*itor).asString() << endl;
}
else if((*itor).isObject()) //对象
{
ParseObject(*itor);
}
else
{
ParseArray(*itor);
}
cout << ',';
}
cout << "]" <<endl;
}
else
{
return;
}
return;
}
运行结果:
{
datas1:[
name
,age
,heigth
,weigth
,]
datas2:[
1
,2
,3
,4
,]
datas3:[
[
11
,22
,33
,]
,]
datas4:[
{
11:11
22:22
33:33
}
,]
description:hello world
double:123.123
reserve:{
{
data:wwweeeerrrrttreee
len:12
}
}
status:false
}