Jsoncppの使い方大全

16749 ワード

Json(JavaScript Object Notation)は軽量レベルのデータ交換フォーマットです.簡単に言えば、Json組織形式はpythonの辞書、C/C++のmapと同様にkey-value対で組織されています.keyは任意の一意の文字列であり、valueはbool、int、stringまたはネストされたjsonであってもよいです.Jsonフォーマットについては公式サイトを参照してください.JsoncppはJsonテキストを処理するためのオープンソースC++ライブラリです.Jsoncppを使用したJsonファイルの一般的な操作について簡単に説明します.
Jsoncpp常用変数の紹介
Jsoncppでは、いくつかのよく使われる変数が特に重要ですが、まず紹介します.
Json::Value
Json::ValueはJsonの任意のvalue抽象データ型を表すために使用されます.具体的には、Jsonのvalueはデータ型を表すことができます.
  • 符号整数signed integer[range:Value::minInt-Value::maxInt]
  • 符号なし整数unsigned integer(range:0-Value::maxUInt)
  • デュアル精度浮動小数点数double
  • 文字列UTF-8 string
  • ブール型boolean
  • 空「null」
  • Valueのシーケンステーブルan ordered list of Value
  • collection of name/value pairs (javascript object)

  • []の方法で値を取ることができます.
    //Examples:
    Json::Value null_value; // null
    Json::Value arr_value(Json::arrayValue); // []
    Json::Value obj_value(Json::objectValue); // {}
    

    Json::Reader
    Json::Readerは、Jsonソースターゲットを解析することで、解析されたJson::Valueを得ることができます.通常、文字列またはファイル入力ストリームはソースターゲットとすることができます.
    今exampleがあるとします.jsonファイル
    {
        "encoding" : "UTF-8",
        "plug-ins" : [
            "python",
            "c++",
            "ruby"
            ],
        "indent" : { "length" : 3, "use_space": true }
    }

    Json::Readerを使用してJsonファイルを解析します.
    bool parse (const std::string &document, Value &root, bool collectComments=true)
    bool parse (std::istream &is, Value &root, bool collectComments=true)
    
    Json::Value root;
    Json::Reader reader;
    std::ifstream ifs("example.json");//open file example.json
    
    if(!reader.parse(ifs, root)){
       // fail to parse
    }
    else{
       // success
       std::cout<["encoding"].asString()<std::cout<["indent"]["length"].asInt()<

    Json::Readerを使用して文字列を解析
    bool Json::Reader::parse ( const char * beginDoc,
            const char * endDoc,
            Value & root,
            bool collectComments = true 
        )   
      Json::Value root;
      Json::Reader reader;
      const char* s = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}"; 
      if(!reader.parse(s, root)){
        // "parse fail";
      }
      else{
          std::cout << root["uploadid"].asString();//print "UP000000"
      }

    Json::Writer
    Json::WriterとJson::Readerは反対に、Json::Valueオブジェクトをstringオブジェクトに書きます.そしてJson::Writerは抽象クラスで、2つのサブクラスJson::FastWriterとJson::StyledWriterに継承されます.簡単に言えばFastWriterは無フォーマットの書き込みで、このようなJsonは乱れてフォーマットがないように見えますが、StyledWriterはフォーマット付きの書き込みで、友好的に見えます.
    Json::Value root;
    Json::Reader reader;
    Json::FastWriter fwriter;
    Json::StyledWriter swriter;
    
    if(! reader.parse("example.json", root)){
    // parse fail
        return 0;
    }
    std::string str = fwriter(root);
    std::ofstream ofs("example_fast_writer.json");
    ofs << str;
    ofs.close();
    
    str = swriter(root);
    ofs.open("example_styled_writer.json");
    ofs << str;
    ofs.close();
    

    結果:example_styled_writer.json
    {
        "encoding" : "UTF-8",
        "plug-ins" : [
            "python",
            "c++",
            "ruby"
            ],
        "indent" : { "length" : 3, "use_space": true }
    }

    example_fast_writer.json
    {"encoding" : "UTF-8","plug-ins" : ["python","c++","ruby"],"indent" : { "length" : 3, "use_space": true}}

    Jsoncppその他の操作
    前述のJson::value,Json::Reader,Json::Readerでは、Jsonファイルの基本的な操作を実現できます.次に、他の一般的な操作について説明します.
    キーが存在するか否かを判断する
    bool Json::Value::isMember ( const char * key) const
    
    Return true if the object has a member named key.
    
    Note
        'key' must be null-terminated. 
    
    bool Json::Value::isMember ( const std::string &  key) const
    bool Json::Value::isMember ( const char* key, const char * end ) const
    
    // print "encoding is a member"
    if(root.isMember("encoding")){
        std::cout<<"encoding is a member"<<std::endl;
    }
    else{
        std::cout<<"encoding is not a member"<<std::endl;
    }
    
    // print "encode is not a member"
    if(root.isMember("encode")){
        std::cout<<"encode is a member"<<std::endl;
    }
    else{
        std::cout<<"encode is not a member"<<std::endl;
    }

    バリューがnullかどうかを判断する
    まずexampleにあげます.jsonはkey-valueペアを追加します.
    {
        "encoding" : "UTF-8",
        "plug-ins" : [
            "python",
            "c++",
            "ruby"
        ],
        "indent" : { "length" : 3, "use_space": true },
        "tab-length":[],
        "tab":null
    }

    nullのメンバー関数かどうかを判断する
    bool Json::Value::isNull ( ) const
    if(root["tab"].isNull()){
        std::cout << "isNull" <<std::endl;//print isNull
    }
    if(root.isMember("tab-length")){//true
        if(root["tab-length"].isNull()){
          std::cout << "isNull" << std::endl;
        }
        else std::cout << "not Null"<<std::endl;
        // print "not Null", there is a array object([]), through this array object is empty
        std::cout << "empty: " << root["tab-length"].empty() << std::endl;//print empty: 1
        std::cout << "size: " << root["tab-length"].size() << std::endl;//print size: 0
      }

    また、Json::ValueとC++のmapには、存在しないkeyにアクセスしようとすると、nullの値ペアが自動的に生成されるという共通の特徴があります.つまり
     root["anything-not-exist"].isNull(); //false
     root.isMember("anything-not-exist"); //true

    まとめると、keyが含まれているかどうかを判断するには、isMemberメンバー関数を使用し、valueがnullであるかどうかはisNullメンバー関数を使用し、valueが空であるかどうかはempty()とsize()メンバー関数を使用します.
    すべてを手に入れたkey
    typedef std::vector<std::string> Json::Value::Members
    
    Value::Members Json::Value::getMemberNames ( ) const
    
    Return a list of the member names.
    
    If null, return an empty list.
    
    Precondition
        type() is objectValue or nullValue 
    
    Postcondition
        if type() was nullValue, it remains nullValue 
    
    

    Json::Value::Membersは実際にstringの値を持つvectorであり、getMemberNameによってすべてのkeyが得られることがわかります.
    メンバーの削除
    Value Json::Value::removeMember( const char* key)   
    
    Remove and return the named member.
    Do nothing if it did not exist.
    
    Returns
        the removed Value, or null. 
    
    Precondition
        type() is objectValue or nullValue 
    
    Postcondition
        type() is unchanged 
    
    Value Json::Value::removeMember( const std::string & key)   
    
    bool Json::Value::removeMember( std::string const &key, Value *removed)         
    
    Remove the named map member.
    Update 'removed' iff removed.
    
    Parameters
        key may contain embedded nulls.
    
    Returns
        true iff removed (no exceptions) 
    
    

    リファレンス
    http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html