zoukankan      html  css  js  c++  java
  • 7、JsonCpp简单使用(3)

    1、相关概念总结

    (1)解析json的方法

    Json::Value json;     //表示一个json格式的对象

    Json::Reader reader;  //json解析

    reader.parse(json_buf/*json格式的字符串*/,json,false);  //解析出json放到json

        jsoncpp库中的Reader类用来将字串或者流载入解析器。后期可以用Reader里面的解析方法把Json字串解码为C++认识的数据。可以用 Json::Reader来声明一个Reader实例。Reader中最常用的就是一个parse方法,该方法用来将载入的json字串解析为C++格式的数据。

    (2) 数组访问

    Json::Value //格式如下

    [["key1":value1],["key2":value2]]

    Json::Value::const_iterator iter;  //迭代器

    for(iter = input.begin(); iter != input.end(); iter++)

    Json::Value::Members member=(*iter).getMemberNames();

    *(member.begin());          // 输出 key1,key2

    (*iter)[*(member.begin())];     //输出 value1,value2

        Value类是库中的核心类,用于存储各样格式的数据,可以包括int,double,short,char *,string,bool,object,array等几乎所有格式的数据。该库的编码和解码的核心功能都是用Value类实现的。就用以上的 Readerparse方法来说,需要传入一个Value类别的引用值,就是用来存储Json数据的根值,并且可以用这个根值来存取其他的所有值。

    (3) 对象访问

    直接用 value["key"]即可

    (4) 输出json格式串

        调用 Json::FastWriterwriter

        writer是该库的一个虚类,没有真正的实现encode的功能。需要重载里头的方法来实现真正的encode功能。FastWriter是该库中真正实现encode功能的类,用来实现将Value编码称为Json串。Json::StyledWriter 是格式化后的json

        不支持utf-8格式的输出,需要自己调用writer之后,用iconv转化成utf-8字符串

    2、示例代码

    1)示例代码1

    View Code
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <string>
    #include <vector>
    #include <iostream>
    #include "json/json.h"
    using namespace std;

    typedef struct piece
    {
    string letter;
    string wild;
    }piece;

    string encode_msg(string token,int game_id,vector<piece> piece_array)
    {
    //Json::Value root;
    Json::Value var;
    //apply “token” and “game_id” value to json struct
    var["token"] = token;
    var["game_id"] = game_id;

    Json::Value pieces;//store all pieces
    for (int i=0;i < piece_array.size();i++)
    {
    Json::Value piece_ex;//here it store just one piece
    //next 4 lines to apply piece value to json struct
    piece_ex["letter"] = piece_array[i].letter;
    piece_ex["wild"] = piece_array[i].wild;
    //ok,yes we just have apply One piece ,then push back to the array
    pieces.append(piece_ex);
    }
    var["piece_array"] = pieces;//yes,store pieces in var [Value]
    //root.append(var);

    Json::FastWriter writer;
    return writer.write(var);//generate json string:),here all is done
    }
    int main()
    {
    piece one, two;
    one.letter = "1";
    one.wild = "ont";
    two.letter = "2";
    two.wild = "two";
    vector<piece> myp;
    myp.push_back(one);
    myp.push_back(two);
    string ret = encode_msg("mytoken", 123, myp);
    cout << ret << endl;
    return 1;
    }

     

    View Code
    {"game_id":123,"piece_array":[{"letter":"1","wild":"ont"},{"letter":"2","wild":"two"}],"token":"mytoken"}

    结果显示

    可以看到,直接用wirter输出的json为非格式化的数据,而通过root.toStyledString()后,代码就是格式化的。

    2)示例3,来源于官网

    View Code
    // Configuration options
    {
    // Default encoding for text
    "encoding" : "UTF-8",

    // Plug-ins loaded at start-up
    "plug-ins" : [
    "python",
    "c++",
    "ruby"
    ],

    // Tab indent size
    "indent" : { "length" : 3, "use_space": true }
    }

     

    View Code
    Json::Value root;   // will contains the root value after parsing.
    Json::Reader reader;
    bool parsingSuccessful = reader.parse( config_doc, root );
    if ( !parsingSuccessful )
    {
    // report to the user the failure and their locations in the document.
    std::cout << "Failed to parse configuration\n"
    << reader.getFormattedErrorMessages();
    return;
    }

    // Get the value of the member of root named 'encoding', return 'UTF-8' if there is no
    // such member.
    std::string encoding = root.get("encoding", "UTF-8" ).asString();
    // Get the value of the member of root named 'encoding', return a 'null' value if
    // there is no such member.
    const Json::Value plugins = root["plug-ins"];
    for ( int index = 0; index < plugins.size(); ++index ) // Iterates over the sequence elements.
    loadPlugIn( plugins[index].asString() );

    setIndentLength( root["indent"].get("length", 3).asInt() );
    setIndentUseSpace( root["indent"].get("use_space", true).asBool() );

    // ...
    // At application shutdown to make the new configuration document:
    // Since Json::Value has implicit constructor for all value types, it is not
    // necessary to explicitly construct the Json::Value object:
    root["encoding"] = getCurrentEncoding();
    root["indent"]["length"] = getCurrentIndentLength();
    root["indent"]["use_space"] = getCurrentIndentUseSpace();

    Json::StyledWriter writer;
    // Make a new JSON document for the configuration. Preserve original comments.
    std::string outputConfig = writer.write( root );

    // You can also use streams. This will put the contents of any JSON
    // stream at a particular sub-value, if you'd like.
    std::cin >> root["subtree"];

    // And you can write to a stream, using the StyledWriter automatically.
    std::cout << root;

    参考

    1】 讲解说明

    http://hi.baidu.com/%B4%AB%CB%B5%D6%D0%B5%C4%C8%CC%D5%DF%C3%A8/blog/item/a6eb970c98a644d67acbe15a.html

    2】 示例,该作者博文不错,涵盖了各个方面

    http://hi.baidu.com/s_jqzhang/blog/item/a3c5df1f9408246ff624e4f5.html/cmtid/02e72e4fcb488039aec3ab28

    3boost库支持json比较好

    http://freedomhui.com/?p=6

    3】 对json的类型作了简单的小结,为json-c进行了介绍

    http://developer.51cto.com/art/201001/176060.htm

    4】 官网

    http://jsoncpp.sourceforge.net/index.html

    相关的类介绍及使用

    http://jsoncpp.sourceforge.net/annotated.html

    【5】 其他例子

     http://joysofprogramming.com/json_parser_json-c/

     http://forum.openframeworks.cc/index.php?topic=2833.0

  • 相关阅读:
    防删没什么意思啊,直接写废你~
    绝大多数情况下,没有解决不了的问题,只有因为平时缺少练习而惧怕问题的复杂度,畏惧的心理让我们选择避让,采取并不那么好的方案去解决问题
    Java 模拟面试题
    Crossthread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on
    一步步从数据库备份恢复SharePoint Portal Server 2003
    【转】理解 JavaScript 闭包
    Just For Fun
    The database schema is too old to perform this operation in this SharePoint cluster. Please upgrade the database and...
    Hello World!
    使用filter筛选刚体碰撞
  • 原文地址:https://www.cnblogs.com/mydomain/p/2241654.html
Copyright © 2011-2022 走看看