JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。jsoncpp是c++解析JSON串常用的解析库之一。

jsoncpp中主要的类:

Json::Value:可以表示所有支持的类型,如:int , double ,string , object, array等。其包含节点的类型判断(isNull,isBool,isInt,isArray,isMember,isValidIndex等),类型获取(type),类型转换(asInt,asString等),节点获取(get,[]),节点比较(重载<,<=,>,>=,==,!=),节点操作(compare,swap,removeMember,removeindex,append等)等函数。

Json::Reader:将文件流或字符串创解析到Json::Value中,主要使用parse函数。Json::Reader的构造函数还允许用户使用特性Features来自定义Json的严格等级。

Json::Writer:与JsonReader相反,将Json::Value转换成字符串流等,Writer类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriter(将数据写入一行,没有格式),Json::StyledWriter(按json格式化输出,易于阅读)。

Json::Reader可以通过对Json源目标进行解析,得到一个解析好了的Json::Value,通常字符串或者文件输入流可以作为源目标。

如下Json文件example.json:

  1.  
    {
  2.  
    "encoding" : "UTF-8",
  3.  
    "plug-ins" : [
  4.  
    "python",
  5.  
    "c++",
  6.  
    "ruby"
  7.  
    ],
  8.  
    "indent" : { "length" : 3, "use_space": true }
  9.  
    "tab":null
  10.  
    }

使用Json::Reader对Json文件进行解析:

  1.  
    Json::Value root;
  2.  
    Json::Reader reader;
  3.  
    std::ifstream ifs("example.json");//open file example.json
  4.  
     
  5.  
    if(!reader.parse(ifs, root)){
  6.  
    // fail to parse
  7.  
    }
  8.  
    else{
  9.  
    // success
  10.  
    std::cout<<root["encoding"].asString()<<endl;
  11.  
    std::cout<<root["indent"]["length"].asInt()<<endl;
  12.  
    }

使用Json::Reader对字符串进行解析:

  1.  
    Json::Value root;
  2.  
    Json::Reader reader;
  3.  
    const char* s = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";
  4.  
    if(!reader.parse(s, root)){
  5.  
    // "parse fail";
  6.  
    }
  7.  
    else{
  8.  
    std::cout << root["uploadid"].asString();//print "UP000000"
  9.  
    }

Json::Writer 和 Json::Reader相反,是把Json::Value对象写到string对象中,而且Json::Writer是个抽象类,被两个子类Json::FastWriter和Json::StyledWriter继承。 
简单来说FastWriter就是无格式的写入,这样的Json看起来很乱没有格式,而StyledWriter就是带有格式的写入,看起来会比较友好。

  1.  
    Json::Value root;
  2.  
    Json::Reader reader;
  3.  
    Json::FastWriter fwriter;
  4.  
    Json::StyledWriter swriter;
  5.  
     
  6.  
    if(! reader.parse("example.json", root)){
  7.  
    // parse fail
  8.  
    return 0;
  9.  
    }
  10.  
    std::string str = fwriter(root);
  11.  
    std::ofstream ofs("example_fast_writer.json");
  12.  
    ofs << str;
  13.  
    ofs.close();
  14.  
     
  15.  
    str = swriter(root);
  16.  
    ofs.open("example_styled_writer.json");
  17.  
    ofs << str;
  18.  
    ofs.close();
  19.  
     
  20.  
    结果1:example_styled_writer.json:
  21.  
    {
  22.  
    "encoding" : "UTF-8",
  23.  
    "plug-ins" : [
  24.  
    "python",
  25.  
    "c++",
  26.  
    "ruby"
  27.  
    ],
  28.  
    "indent" : { "length" : 3, "use_space": true }
  29.  
    "tab":null
  30.  
    }
  31.  
     
  32.  
    结果2:example_fast_writer.json:
  33.  
    {"encoding" : "UTF-8","plug-ins" : ["python","c++","ruby"],"indent" : { "length" : 3, "use_space": true}}

Json其它函数的应用:
1、判断KEY值是否存在:

  1.  
    if(root.isMember("encoding")){
  2.  
    std::cout<<"encoding is a member"<<std::endl;
  3.  
    }
  4.  
    else{
  5.  
    std::cout<<"encoding is not a member"<<std::endl;
  6.  
    }

2、判断Value是否为null:

if(root["tab"].isNull()){
    std::cout << "isNull" <<std::endl;//print isNull
}

完整例子使用举例来自于CSDN下载网友的程序:

源码下载地址:http://download.csdn.net/download/woniu211111/9966907

  1.  
    /********************************************************
  2.  
    Copyright (C), 2016-2017,
  3.  
    FileName: main
  4.  
    Author: woniu201
  5.  
    Email: wangpengfei.201@163.com
  6.  
    Created: 2017/09/06
  7.  
    Description:use jsoncpp src , not use dll, but i also provide dll and lib.
  8.  
    ********************************************************/
  9.  
     
  10.  
    #include "stdio.h"
  11.  
    #include <string>
  12.  
    #include "jsoncpp/json.h"
  13.  
     
  14.  
    using namespace std;
  15.  
     
  16.  
    /************************************
  17.  
    @ Brief: read file
  18.  
    @ Author: woniu201
  19.  
    @ Created: 2017/09/06
  20.  
    @ Return: file data
  21.  
    ************************************/
  22.  
    char *getfileAll(char *fname)
  23.  
    {
  24.  
    FILE *fp;
  25.  
    char *str;
  26.  
    char txt[1000];
  27.  
    int filesize;
  28.  
    if ((fp=fopen(fname,"r"))==NULL){
  29.  
    printf("open file %s fail \n",fname);
  30.  
    return NULL;
  31.  
    }
  32.  
     
  33.  
    /*
  34.  
    获取文件的大小
  35.  
    ftell函数功能:得到流式文件的当前读写位置,其返回值是当前读写位置偏离文件头部的字节数.
  36.  
    */
  37.  
    fseek(fp,0,SEEK_END);
  38.  
    filesize = ftell(fp);
  39.  
     
  40.  
    str=(char *)malloc(filesize);
  41.  
    str[0]=0;
  42.  
     
  43.  
    rewind(fp);
  44.  
    while((fgets(txt,1000,fp))!=NULL){
  45.  
    strcat(str,txt);
  46.  
    }
  47.  
    fclose(fp);
  48.  
    return str;
  49.  
    }
  50.  
     
  51.  
    /************************************
  52.  
    @ Brief: write file
  53.  
    @ Author: woniu201
  54.  
    @ Created: 2017/09/06
  55.  
    @ Return:
  56.  
    ************************************/
  57.  
    int writefileAll(char* fname,const char* data)
  58.  
    {
  59.  
    FILE *fp;
  60.  
    if ((fp=fopen(fname, "w")) == NULL)
  61.  
    {
  62.  
    printf("open file %s fail \n", fname);
  63.  
    return 1;
  64.  
    }
  65.  
     
  66.  
    fprintf(fp, "%s", data);
  67.  
    fclose(fp);
  68.  
     
  69.  
    return 0;
  70.  
    }
  71.  
     
  72.  
    /************************************
  73.  
    @ Brief: parse json data
  74.  
    @ Author: woniu201
  75.  
    @ Created: 2017/09/06
  76.  
    @ Return:
  77.  
    ************************************/
  78.  
    int parseJSON(const char* jsonstr)
  79.  
    {
  80.  
    Json::Reader reader;
  81.  
    Json::Value resp;
  82.  
     
  83.  
    if (!reader.parse(jsonstr, resp, false))
  84.  
    {
  85.  
    printf("bad json format!\n");
  86.  
    return 1;
  87.  
    }
  88.  
    int result = resp["Result"].asInt();
  89.  
    string resultMessage = resp["ResultMessage"].asString();
  90.  
    printf("Result=%d; ResultMessage=%s\n", result, resultMessage.c_str());
  91.  
     
  92.  
    Json::Value & resultValue = resp["ResultValue"];
  93.  
    for (int i=0; i<resultValue.size(); i++)
  94.  
    {
  95.  
    Json::Value subJson = resultValue[i];
  96.  
    string cpuRatio = subJson["cpuRatio"].asString();
  97.  
    string serverIp = subJson["serverIp"].asString();
  98.  
    string conNum = subJson["conNum"].asString();
  99.  
    string websocketPort = subJson["websocketPort"].asString();
  100.  
    string mqttPort = subJson["mqttPort"].asString();
  101.  
    string ts = subJson["TS"].asString();
  102.  
     
  103.  
    printf("cpuRatio=%s; serverIp=%s; conNum=%s; websocketPort=%s; mqttPort=%s; ts=%s\n",cpuRatio.c_str(), serverIp.c_str(),
  104.  
    conNum.c_str(), websocketPort.c_str(), mqttPort.c_str(), ts.c_str());
  105.  
    }
  106.  
    return 0;
  107.  
    }
  108.  
     
  109.  
    /************************************
  110.  
    @ Brief: create json data
  111.  
    @ Author: woniu201
  112.  
    @ Created: 2017/09/06
  113.  
    @ Return:
  114.  
    ************************************/
  115.  
    int createJSON()
  116.  
    {
  117.  
    Json::Value req;
  118.  
    req["Result"] = 1;
  119.  
    req["ResultMessage"] = "200";
  120.  
     
  121.  
    Json::Value object1;
  122.  
    object1["cpuRatio"] = "4.04";
  123.  
    object1["serverIp"] = "42.159.116.104";
  124.  
    object1["conNum"] = "1";
  125.  
    object1["websocketPort"] = "0";
  126.  
    object1["mqttPort"] = "8883";
  127.  
    object1["TS"] = "1504665880572";
  128.  
    Json::Value object2;
  129.  
    object2["cpuRatio"] = "2.04";
  130.  
    object2["serverIp"] = "42.159.122.251";
  131.  
    object2["conNum"] = "2";
  132.  
    object2["websocketPort"] = "0";
  133.  
    object2["mqttPort"] = "8883";
  134.  
    object2["TS"] = "1504665896981";
  135.  
     
  136.  
    Json::Value jarray;
  137.  
    jarray.append(object1);
  138.  
    jarray.append(object2);
  139.  
     
  140.  
    req["ResultValue"] = jarray;
  141.  
     
  142.  
    Json::FastWriter writer;
  143.  
    string jsonstr = writer.write(req);
  144.  
     
  145.  
    printf("%s\n", jsonstr.c_str());
  146.  
     
  147.  
    writefileAll("createJson.json", jsonstr.c_str());
  148.  
    return 0;
  149.  
    }
  150.  
     
  151.  
    int main()
  152.  
    {
  153.  
    /*读取Json串,解析Json串*/
  154.  
    char* json = getfileAll("parseJson.json");
  155.  
    parseJSON(json);
  156.  
    printf("===============================\n");
  157.  
     
  158.  
    /*组装Json串*/
  159.  
    createJSON();
  160.  
     
  161.  
    getchar();
  162.  
    return 1;
  163.  
    }

参考:

http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html

http://blog.csdn.net/yc461515457/article/details/52749575

JsonCpp使用方法详解的更多相关文章

  1. session的使用方法详解

    session的使用方法详解 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器 ...

  2. Kooboo CMS - Html.FrontHtml[Helper.cs] 各个方法详解

    下面罗列了方法详解,每一个方法一篇文章. Kooboo CMS - @Html.FrontHtml().HtmlTitle() 详解 Kooboo CMS - Html.FrontHtml.Posit ...

  3. HTTP请求方法详解

    HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源]     GET方法用来请求已被URI识别的资源.指定 ...

  4. ecshop后台增加|添加商店设置选项和使用方法详解

    有时候我们想在Ecshop后台做个设置.radio.checkbox 等等来控制页面的显示,看看Ecshop的设计,用到了shop_config这个商店设置功能 Ecshop后台增加|添加商店设置选项 ...

  5. (转)Spring JdbcTemplate 方法详解

    Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...

  6. C++调用JAVA方法详解

    C++调用JAVA方法详解          博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...

  7. windows.open()、close()方法详解

    windows.open()方法详解:         window.open(URL,name,features,replace)用于载入指定的URL到新的或已存在的窗口中,并返回代表新窗口的Win ...

  8. CURL使用方法详解

    php采集神器CURL使用方法详解 作者:佚名  更新时间:2016-10-21   对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程 ...

  9. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

随机推荐

  1. document.write vs document.getElementById

    document.write: JavaScript中对document.open所开启的文档流(document stream操作的API方法,它能够直接在文档流中写入字符串,一旦文档流已经关闭,那 ...

  2. zoj2112&&bzoj1901

    题解: 可修改的主席树 一开始,我就按照最暴力的方法,空间nlognlogn 然后zju上面过不了,bzoj没有权限号 然后,参考了往上的论文,发现可以把初始的主席树先建好 然后,每次只需要维护修改的 ...

  3. 51nod1295

    题解: 考虑到是异或,那么就是位运算 位运算会想到什么?当然是按位拆开 那么就变成了一个个的字符串 考虑了trie 可是貌似有多个问题 那么就用可持久化trie! 代码: #include<bi ...

  4. win764位下mysql-5.6.24-x64从安装到登录成功

    1.安装 本人电脑win7,64位,需要安装mysql服务器.版本:mysql-5.6.24-x64.这里我用的是绿色版,免安装.由于免安装的原因,在服务里面并没有mysql的服务.这里我需要打开my ...

  5. Oracle 固定执行计划-使用SPM(Sql Plan Management)固定执行计划

    固定执行计划-使用SPM(Sql Plan Management)固定执行计划 转载自:http://www.lunar2013.com/2016/01/固定执行计划-使用spm%EF%BC%88sq ...

  6. python Django 之 Model ORM inspectdb(数据库表反向生成)

    在前一篇我们说了,mybatis-generator反向生成代码. 这里我们开始说如何在django中反向生成mysql model代码. 我们在展示django ORM反向生成之前,我们先说一下怎么 ...

  7. Python sqlalchemy使用

    import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declar ...

  8. 2014.04.14 Lastpass活动,2年高级版

    点击进入活动地址. 我的邀请地址,^_^

  9. NBUT 1221 Intermediary 2010辽宁省赛

    Time limit 1000 ms Memory limit 131072 kB It is widely known that any two strangers can get to know ...

  10. 任务02——安装 Intellj IDEA,编写一个简易四则运算小程序,并将代码提交到 GitHub

    github地址:https://github.com/ErhuoHome/First.git 安装jdk与intellij idea没有太大问题,以前安装过eclipse 在程序方面,由于对真分数的 ...