2011-09-26 20 views
9

私はjsoncppを使用していると私は、彼らが作家のいずれかを使用して書かれている場合、JSONメッセージがフォーマットされている方法で問題を抱えています。例えばjsoncppの書式設定の問題

{"name":"monkey"} 

私はマニュアルを見てきたと言及しているがあります。私は実際にしたいものの

root["name"] = "monkey"; 
std::cout << writer.write(root) << "\n"; 

が私にこの

{ 
    "name" : "monkey" 
} 

のようにフォーマットされたものを提供しますsetIndentLength()のものですが、ソースファイルには表示されません。廃止されたもの、または何か。

とにかく誰もがこれを行う方法を知っていますか?あなたはJsoncppバージョン1.1を使用している場合

+0

「ライター」が何であるかを示す必要があります。その手がかりはそのタイプにあります。 –

答えて

5

、あなたはJson::FastWriterの代わりに、Json::StyledWriterまたはJson::Writerを使用することができます。

JSON文書は、単一の行に書かれています。それは 「人間の消費のために意図されていないが、帯域幅が限られているRPC などの機能をサポートするために便利かもしれません。

+0

私はjsoncpp 1.8.3を持っていますが、どのようにしてver1.1に戻ることができますか? @deepmax – Alper

2

FastWriterStyledWriterStyledStreamWriter、およびWriterdeprecatedです。 StreamWriterBuilderを使用して、若干異なるAPIを使用してStreamWriterを作成します。

Json::StreamWriterBuilder builder; 
builder.settings_["indentation"] = ""; 
std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter()); 
writer->write(root, &std::cout); 
+0

なぜ 'settings'は末尾のアンダースコアを持っていますか? 。はい、私はなぜそれをしないことを理解::( –

+0

は、それが – mpromonet

+0

@mpromonet(http://open-source-parsers.github.io/jsoncpp-docs/doxygen/class_json_1_1_stream_writer_builder.htmlを参照)クラスのメンバー名です@LightnessRacesinOrbit末尾のアンダースコアを持っている?それはIMO、パブリックインターフェイスのためにかなり奇妙だ。 –

1

cdunn2001の回答の延長として、デフォルト設定(.settings_)を書き直す必要はありません。 StreamWriterBuilder Builderの「インデント」値をオーバーライドするだけで済みます。

Json::Value json = ... 
Json::StreamWriterBuilder builder; 
builder["commentStyle"] = "None"; 
builder["indentation"] = ""; //The JSON document is written in a single line 
std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter()); 
writer->write(json, &std::cout); 
+0

この回答を少し説明してください。コードのみの回答はほとんど価値がありません。ありがとう!良い仕事を続けてください! –

+0

@progressive_overloadありがとうございます。いくつかの説明を追加しました。 – Ramiro