Jsoncppの使い方大全
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)
[]の方法で値を取ることができます.
Json::Reader
Json::Readerは、Jsonソースターゲットを解析することで、解析されたJson::Valueを得ることができます.通常、文字列またはファイル入力ストリームはソースターゲットとすることができます.
今exampleがあるとします.jsonファイル
Json::Readerを使用してJsonファイルを解析します.
Json::Readerを使用して文字列を解析
Json::Writer
Json::WriterとJson::Readerは反対に、Json::Valueオブジェクトをstringオブジェクトに書きます.そしてJson::Writerは抽象クラスで、2つのサブクラスJson::FastWriterとJson::StyledWriterに継承されます.簡単に言えばFastWriterは無フォーマットの書き込みで、このようなJsonは乱れてフォーマットがないように見えますが、StyledWriterはフォーマット付きの書き込みで、友好的に見えます.
結果:example_styled_writer.json
example_fast_writer.json
Jsoncppその他の操作
前述のJson::value,Json::Reader,Json::Readerでは、Jsonファイルの基本的な操作を実現できます.次に、他の一般的な操作について説明します.
キーが存在するか否かを判断する
バリューがnullかどうかを判断する
まずexampleにあげます.jsonはkey-valueペアを追加します.
nullのメンバー関数かどうかを判断する
また、Json::ValueとC++のmapには、存在しないkeyにアクセスしようとすると、nullの値ペアが自動的に生成されるという共通の特徴があります.つまり
まとめると、keyが含まれているかどうかを判断するには、isMemberメンバー関数を使用し、valueがnullであるかどうかはisNullメンバー関数を使用し、valueが空であるかどうかはempty()とsize()メンバー関数を使用します.
すべてを手に入れたkey
Json::Value::Membersは実際にstringの値を持つvectorであり、getMemberNameによってすべてのkeyが得られることがわかります.
メンバーの削除
リファレンス
http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html
Jsoncpp常用変数の紹介
Jsoncppでは、いくつかのよく使われる変数が特に重要ですが、まず紹介します.
Json::Value
Json::ValueはJsonの任意のvalue抽象データ型を表すために使用されます.具体的には、Jsonのvalueはデータ型を表すことができます.
[]の方法で値を取ることができます.
//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