zoukankan      html  css  js  c++  java
  • JsonCpp的简单使用方法

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
    JsonCpp 是一个C++用来处理JSON 数据的开发包。面讲一下怎么使用JsonCpp来序列化和反序列化Json对象,以实际代码为例子。

    1、 编译jsoncpp
      从(http://jsoncpp.sourceforge.net/)下载源码包“jsoncpp-src-0.5.0.tar.gz”,解压后在其解压后目录中运行
    $ scons platform=linux-gcc
      编译出来的库文件在其libs/ linux-gcc-4.4.2目录下,有libjson_linux-gcc-4.4.2_libmt.so和libjson_linux-gcc-4.4.2_libmt.a。头文件在解压目录下的include中。我的jsoncpp安装在$HOME/usr/jsoncpp下。

    $ mkdir ~/usr/jsoncpp

    $ cp -r include ~/usr/jsoncpp

    $ cp -r libs ~/usr/jsoncpp

    2、 Jsoncpp简单实例

    1) 反序列化Json对象
      比如一个Json对象的字符串序列如下,其中”array”:[...]表示Json对象中的数组:

    {“key1”:”value1”,”array”:[{“key2”:”value2”},{“key2”:”value3”},{“key2”:”value4”}]}

      那怎么分别取到key1和key2的值呢,代码如下所示:

    #include <iostream>#include <string>#include "json/json.h" intmain(void){     std::string strValue = "{"key1":"value1","array":[{"key2":"value2"},{"key2":"value3"},{"key2":"value4"}]}";      Json::Reader reader;     Json::Value value;      if(reader.parse(strValue, value))     {      std::string out = value["key1"].asString();      std::cout << out << std::endl;      constJson::Value arrayObj = value["array"];      for(inti=0; i<arrayObj.size(); i++)      {           out = arrayObj[i]["key2"].asString();           std::cout << out;           if(i != arrayObj.size() - 1)            std::cout << std::endl;      }     }     return0;}编译连接
    $ g++ jscpp1.cpp -I$HOME/usr/jsoncpp/include/ ~/usr/jsoncpp/libs/linux-gcc-4.5.2/libjson_linux-gcc-4.5.2_libmt.a
    $ ./a.out
    value1
    value2
    value3
    value4

    2)序列化Json对象
      先构建一个Json对象,此Json对象中含有数组,然后把Json对象序列化成字符串,代码如下:#include <iostream>#include <string>#include "json/json.h" intmain(void){     Json::Value root;     Json::Value arrayObj;     Json::Value item;      for(inti = 0; i < 10; i ++)     {      item["key"] = i;      arrayObj.append(item);     }      root["key1"] = "value1";     root["key2"] = "value2";     root["array"] = arrayObj;     //root.toStyledString();     std::string out = root.toStyledString();     std::cout << out << std::endl;     return0;}

    编译连接
    $ g++ jscpp2.cpp -I$HOME/usr/jsoncpp/include/ ~/usr/jsoncpp/libs/linux-gcc-4.5.2/libjson_linux-gcc-4.5.2_libmt.a
    $ ./a.out
    {
       "array" : [
          {
             "key" : 0
          },
          {
             "key" : 1
          },
          {
             "key" : 2
          },
          {
             "key" : 3
          },
          {
             "key" : 4
          },
          {
             "key" : 5
          },
          {
             "key" : 6
          },
          {
             "key" : 7
          },
          {
             "key" : 8
          },
          {
             "key" : 9
          }
       ],
       "key1" : "value1",
       "key2" : "value2"
    }

    一般情况下在python下,习惯用字典来表示复杂类型。但是一般c++里边会用vector来存储复杂类型,那么就存在转换的问题,下面小段代码记录了将字符串转换为Vector的过程

    待转换的字符串如下:

    const char * jsongroupinfo="[{"groupId" :946838524,"groupname" :"bababa", "mask":1,"parentid":946755072}]";

        Json::Reader reader;
        Json::Value json_object;
        if (!reader.parse(jsongroupinfo, json_object))
            return "parse jsonstr error";
        SUserChggroup sucg;
        VECTOR< SUserChggroup > m_groupInfo;
        for(int i = 0; i < json_object.size(); i ++)
        {
            Json::Value &current = json_object[i];
            sucg.m_groupId = current["groupId"].asInt();
            sucg.m_groupName = current["groupname"].asString();
            sucg.m_mask = current["mask"].asInt();
            sucg.m_parentId = current["parentid"].asInt();
            m_groupInfo.push_back(sucg);
        }

  • 相关阅读:
    python hmac解密
    pymongo加索引以及查看索引例子
    语音-数字中继-E1-学习帖
    Partition does not start on physical sector boundary
    吃自助餐怎么样一个顺序吃法才合算?
    关于ROS证书导入的步骤
    MikroTik-ROS-无线设备传输距离
    这个移动通讯中 DB 、DBm 、瓦的基本知识的问题:
    涨姿势 | 无线通讯距离现场评估知多少?
    linux下生成https的crt和key证书
  • 原文地址:https://www.cnblogs.com/MingZznet/p/3228173.html
Copyright © 2011-2022 走看看