jsoncpp

 

jsoncpp

目录

jsoncpp

jsoncpp简介:

jsoncpp官网:

json接口说明:

jsoncpp库安装:

Jsoncpp库测试:

编译(添加 -ljsoncpp 选项):

json语法基础介绍:

json介绍官网:http://www.json.org/json-zh.html

JSON 语法规则:

JSON书写格式:

JSON的值:

jsoncpp核心类:

jsoncpp 解析json:



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
}

 

上一篇:linux jsoncpp源码编译


下一篇:jsoncpp中文写入为\u****问题处理;jsoncpp中文乱码解决;源码方式使用jsoncpp;UTF_8和ASSIC相互转换;