Jsoncpp的安装与使用

Jsoncpp的安装与使用

在实际项目中,很多的启动文件,配置文件与数据传输格式都是使用json来进行的,好处不便多说。
1.安装
本人操作系统为ubuntu 16.04,直接运行下列语句就安装完毕。
将 /libjson_linux-gcc-5.4.0_libmt.* 放在 /lib/ 目录下。

sudo apt-get install libjsoncpp-dev

2.使用
**(1)先上要解析的json格式文件
其文件名为:json_text.txt

{
    "face":
    [
        {
            "attribute":
            {
                "age":27,
                "gender":"Male",
                "lefteye_opendegree":43,
                "mouth_opendegree":2,
                "pose":
                {
                    "raise":-21,
                    "tilting":-2,
                    "turn":4
                },
                "righteye_opendegree":47
            },
            "face_id":"83e3edac3d5d49579089d3ee043d41ec",
            "position":
            {
                "center":{"x":179,"y":50},
                "eye_left":{"x":206,"y":78},
                "eye_right":{"x":248,"y":78},
                "height":94,
                "width":94
            },
            "tag":""
        }
    ],
    "devices": [u'000_ce21',u'0000_ce22'],
    "img_height":500,
    "img_id":"030-3aff983ea4ea5a35f89ae6",
    "img_width":350,
    "res_code":"0000",
    "url":"http://e.hiphotos.baidu.com/baike/pic/item/9345d688d43f879428d347b3d81b0ef41bd53a7a.jpg"
}

(2)解析
“devices”: [u’000_ce21’,u’0000_ce22’],此种格式在json 是认识的,因此我们先要对其进行处理,转换为:”devices”: [“000_ce21”,”0000_ce22”]。具体的解析代码如下:
命名为 jsoncpp_parse_test.cpp

#include <iostream>
#include <fstream>
#include "json/json.h"
using namespace std;
using namespace Json;

string & replace_all(string& str,const string& old_value,const string& new_value)     
    {     
        while(true)
        {     
            string::size_type   pos(0);     
            if((pos=str.find(old_value))!=string::npos)     
                str.replace(pos,old_value.length(),new_value);     
            else  
                break;     
        }     
        return  str;     
    }     

int main()
{
    Json::Value root;  
    Json::Reader reader;
    string inputsStr,onelineStr;
    std::ifstream ifs;
    ifs.open("json_text.txt");
    while   (getline(ifs,onelineStr))
    {
        inputsStr+=onelineStr;
    }

    //cout<<inputsStr<<endl<<endl;

    inputsStr = replace_all(inputsStr,"u'","\""); 

    inputsStr = replace_all(inputsStr,"'","\"");
    //cout<<inputsStr<<endl<<endl;

    if(!reader.parse(inputsStr, root)){  
       // fail to parse  
        cout << "img_width:\t"<<"error parse"<<endl;
    }  
    else
    {  
        // success  
        cout<<root["face"][0U]["face_id"];
        //string faceId = root["face"][0]["face_id"].asString();
        int imgWidth = (int)root["img_width"].asInt();
        int imgHeight = root["img_height"].asInt();
        string resCode = root["res_code"].asString();
        string url = root["url"].asString();
        //cout << "face_id:\t" << faceId << endl;
        cout << "img_width:\t" << imgWidth << endl;
        cout << "img_height:\t" << imgHeight << endl;
        cout << "res_code:\t" << resCode << endl;
        cout << "url:\t\t" << url << endl;

        unsigned int dev_size =  root["devices"].size();
        for (unsigned int i = 0; i < dev_size; ++i)
        {
            cout<<"i:"<<i<<root["devices"][i]<<endl;
        }
    }  
    return 0;
}

基本思路:
将json中的内容加载到string 变量inputsStr中,在用reader.parse进行匹配是否符合json格式。在解析中数组的下标是unsigned int 类型,整数数在编译器中默认的是int类型,可以在其后面加U,比如0则为0U,否则会编译通过,运行segment error。

(3)编译脚本

#!/bin/sh
g++ jsoncpp_parse_test.cpp  -o test_cpp /lib/libjson_linux-gcc-5.4.0_libmt.so

(4)运行结果
这里写图片描述

(5)有时 键值是不确定的,那如何解析呢?
json文件格式:

{"hunan":["cs","zz","xt"],"jiangxi":["nc","xy"]}

解析代码

#include <iostream>
#include <fstream>
#include "json/json.h"
using namespace std;
using namespace Json;

int main()
{
    Value root;  
    Reader reader;
    string inputsStr,onelineStr;
    ifstream ifs;
    ifs.open("json_not_known_key.txt");
    while   (getline(ifs,onelineStr))
    {
        inputsStr+=onelineStr;
    }

    if(!reader.parse(inputsStr,root))
    {  
       // fail to parse  
       cout<<"  "<<"fail to parse,file not json type"<<endl;
    }  
    else
    {
        Json::Value::Members member = root.getMemberNames();
        for(Json::Value::Members::iterator iter = member.begin(); iter != member.end(); ++iter)
        {
            string area = *iter;            
            unsigned int city_size = root[*iter].size();
            cout<<"city  "<<city_size<<endl;
            for (unsigned int iUid = 0; iUid < city_size; ++iUid)
            {
                string city = root[*iter][iUid].asString();
                cout<<"area: "<<area<<"  city:  "<< city<<endl;             
            }
        }
    }
}

结果:
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值