zoukankan      html  css  js  c++  java
  • JSON函数表2

    [class] Json::Reader
    [public]
    [将字符串或者输入流转换为JSON的Value对象]
    bool parse( const std::string &document, Value &root, bool collectComments = true );
    bool parse( const char *beginDoc, const char *endDoc, Value &root,bool collectComments = true );
    bool parse( std::istream &is,Value &root,bool collectComments = true ); // 从文件流中读取
    // ture success ; false error
    [获取满足相应条件的Value]
    std::string getFormatedErrorMessages() const;//返回成员命名的关键如果它存在,否则defaultValue


    [class] Json::Value

    [注意] Json::Value 只能处理 ANSI 类型的字符串,如果 C++ 程序是用 Unicode 编码的,最好加一个 Adapt 类来适配
    [注意] 要取下标为 0 的value值, 只能通过 int i=0;value[i]; 不能是 value[0];
    [public]
    [获取满足相应条件的Value]
    Value get( Uint index, const Value &defaultValue ) const;
    Value get( const char *key, const Value &defaultValue) const; //查找是否存在 索引key ,存在则返回其对应的 :value
    Value get( const std::string &key, const Value &defaultValue ) const;
    例如:
    Json::root["one"] = 456;
    Json::Value root04 = root.get("one", root);
    cout << root04.asUInt() << endl; //456
    [Value转基本格式]
    Int asInt() const;
    UInt asUInt() const; //能不转有符号的int
    Int64 asInt64() const;
    LargestInt asLargesInt() const;
    LargestUInt asLargestUInt() const;
    float asFloat() const;
    double asDouble() const;
    bool asBool() const;
    std::string asString() const;
    const char* asCString() const;
    std::string toStyledString() const; // 可以把整个 value 转为 string 格式
    [判断Value格式]
    bool isNull() const;
    bool isBool() const;
    bool isDouble() const;
    bool isInt() const;
    bool isString() const;
    bool isArrar() const;
    bool isObject() const;
    bool isMember (const char *key) const //Return true if the object has a member named key.
    bool isMember (const std::string &key) const //Return true if the object has a member named key.
    [相同类型的比较、交换、类型的获取]
    int compare( const Value &other ); //比较两个 Value
    void swap(Value &other); //交换两个 Value 的内容
    ValueType type()const; //Value 的格式
    [其他功能]
    ArrayIndex size() const; //Number of values in array or object //typedef unsigned int Json::ArrayIndex
    Value& append(const Value &value) //append value to < array > at the end;
    void clear(); //remove all object members and array elements
    void resize(ArrayIndex index); //调整array元素的个数,其他格式无法使用
    void empty() const; //Number of values in array or object
    Value removeMember(const char* key); //Remove and return the named member
    Value removeMember(const std::string &key); //Same as removeMember(const char*).
    [勾造函数]
    Value (ValueType type=nullValue) Create a default Value of the given type.
    Value (Int value)
    Value (UInt value)
    Value (Int64 value)
    Value (UInt64 value)
    Value (double value)
    Value (const char *value)
    Value (const char *beginValue, const char *endValue)
    Value (const StaticString &value) Constructs a value from a static string.
    Value (const std::string &value)
    Value (bool value)
    Value (const Value &other)
    [迭代器] Json::Value::const_iterator
    const_iterator begin () const
    const_iterator end () const
    iterator begin ()
    iterator end ()
    //这个迭代器不要使用 != == 进行比较
    [操作符比较]
    bool operator< (const Value &other) const //类型相等 -> 元素个数相等 -> 比较地址
    bool operator<= (const Value &other) const //
    bool operator>= (const Value &other) const //
    bool operator> (const Value &other) const //
    bool operator== (const Value &other) const //类型不相等返回 0 ,内容一致返回 1
    例: char arr[4] = {'1','2','3',''}; string str = "123";
    root["one"] == "123";
    root["one"] == str;
    root["one"] == arr;
    root["one"].asString() == arr;
    root["one"].asString() == str;
    root["one"].asString().c_str() == str.c_str(); //error
    bool operator!= (const Value &other) const //类型不相等返回 1 ,内容一致返回 0
    比较类型,类型相等->比较元素个数,个数相等->比较元素值
    (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

    [class] Json::FastWriter

    [public]
    void enableYAMLCompatibility () //转格式时,是否在 :后面加一空格
    virtual std::string write (const Value &root) //把 Value 转为 std::string,不格式化

    [class] Json::StyledWriter

    是格式化后的json

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

    [class] Json::Writer

    继承 FastWriter StyledWriter, 它是一个虚类


    [type]

    enum ValueType
    {
    nullValue = 0, ///< 'null' value
    intValue, ///< signed integer value
    uintValue, ///< unsigned integer value
    realValue, ///< double value
    stringValue, ///< UTF-8 string value
    booleanValue, ///< bool value
    arrayValue, ///< array value (ordered list)
    objectValue ///< object value (collection of name/value pairs).
    };


    ----------------------------------------------------------------------------------------------------

    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类实现的。就用以上的 Reader的parse方法来说,需要传入一个Value类别的引用值,就是用来存储Json数据的根值,并且可以用这个根值来存取其他的所有值。

    (3) 对象访问

    直接用 value["key"]即可

    (4) 输出json格式串

    调用 Json::FastWriter的writer

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

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

    2、示例代码

    1)示例代码1
    复制代码

    #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;
    }

    复制代码

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

    结果显示

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

    2)示例3,来源于官网
    复制代码

    // 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 }
    }

    复制代码


    复制代码

    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 "
    << 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;

    转自:https://www.cnblogs.com/mydomain/archive/2011/11/08/2241654.html

  • 相关阅读:
    C# 字符串相似度算法
    在C# 中枚举COM对象的方法和属性名称
    question:读取以TAB为分隔符CSV文件时遇到的问题
    WCF文件传输
    C#读写XML的演示程序(1)
    C#解析HTML 的两种方法
    在C#中使用MSHTML的高级支持接口
    XML读写演示程序(2)
    聊天程序WMChat开发文档
    数据表之间的链接
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/10962994.html
Copyright © 2011-2022 走看看