2017-07-21 26 views
0

*.jsonファイルを読み込んで、出力をstd::stringにするにはどうすればよいですか?jsonファイルをrapidjsonで読み込んでstd :: stringに出力するには?

私はこのサンプルを持っていますが、nullはいつもstd::stringになります。

#include <rapidjson/document.h> 
#include <rapidjson/istreamwrapper.h> 
#include "rapidjson/writer.h" 
#include "rapidjson/stringbuffer.h" 
#include <rapidjson/ostreamwrapper.h> 
#include <fstream> 
#include <iostream> 

using namespace rapidjson; 
using namespace std; 

void main() 
{ 
    ifstream ifs("input.json"); 
    IStreamWrapper isw(ifs); 
    Document d; 
    d.ParseStream(isw); 

    StringBuffer buffer; 
    Writer<StringBuffer> writer(buffer); 
    d.Accept(writer); 

    std::string jsonStr(buffer.GetString()); 
    if(jsonStr == "null") 
     std::cout << "is null..." << std::endl; //<--always here! 
    else 
    { 
     std::cout << jsonStr.c_str() << std::endl; 

     d["ip"] = "123456789"; 

     ofstream ofs("output.json"); 
     OStreamWrapper osw(ofs); 
     Writer<OStreamWrapper> writer2(osw); 
     d.Accept(writer2); 
    } 
} 

これは私のJSONファイルです:

{ 
    "ip" : "192.168.0.100", 
    "angle x": 20, 
    "angle y": 0, 
    "angle z": 0 
} 
+1

?ファイル全体を 'string'に読み込みたいのであれば、rapidjsonは必要ありません。 – Heavy

+0

ファイルから読み込み、jsonでいくつかのフィールドを変更し、別のファイルに書き戻したい。 – waas1919

+0

@ waas1919:あなたのファイル 'input.json'には何が入っていますか?最小限の有効なJSONをここに投稿してください。あなたの解析が[HasParseError()](http://rapidjson.org/classrapidjson_1_1_generic_document.html#a7607bb42b51547e44bfd4cab35d8f20e)と[GetParseError()](http://rapidjson.org/classrapidjson_1_1_generic_document.html#ab94c280c079a6837a24951cb4d8f337b)で成功していることを検証しました? – Azeem

答えて

2

std::stringに変換する前に、すべてのエラーを確認する必要があります。ファイルが読み取り/書き込み用に開かれていることを確認し、解析が成功した、つまりJSONが有効であることを確認します。 GetParseError()およびGetErrorOffset()は、解析を検証する関数です。

私はあなたの例を使用して拡張しました。あなたが気にしないことを願っています。 :-)ここ

ですexample作業:あなたは正確に達成しようとしている何

#include <iostream> 
#include <fstream> 
#include <cstdlib> 
#include <rapidjson/document.h> 
#include <rapidjson/istreamwrapper.h> 
#include <rapidjson/writer.h> 
#include <rapidjson/stringbuffer.h> 
#include <rapidjson/ostreamwrapper.h> 

int main() 
{ 
    using namespace rapidjson; 

    std::ifstream ifs { R"(C:\Test\Test.json)" }; 
    if (!ifs.is_open()) 
    { 
     std::cerr << "Could not open file for reading!\n"; 
     return EXIT_FAILURE; 
    } 

    IStreamWrapper isw { ifs }; 

    Document doc {}; 
    doc.ParseStream(isw); 

    StringBuffer buffer {}; 
    Writer<StringBuffer> writer { buffer }; 
    doc.Accept(writer); 

    if (doc.HasParseError()) 
    { 
     std::cout << "Error : " << doc.GetParseError() << '\n' 
        << "Offset : " << doc.GetErrorOffset() << '\n'; 
     return EXIT_FAILURE; 
    } 

    const std::string jsonStr { buffer.GetString() }; 

    std::cout << jsonStr << '\n'; 

    doc[ "ip" ] = "127.0.0.1"; 

    std::ofstream ofs { R"(C:\Test\NewTest.json)" }; 
    if (!ofs.is_open()) 
    { 
     std::cerr << "Could not open file for writing!\n"; 
     return EXIT_FAILURE; 
    } 

    OStreamWrapper osw { ofs }; 
    Writer<OStreamWrapper> writer2 { osw }; 
    doc.Accept(writer2); 

    return EXIT_SUCCESS; 
} 
0

私がコメントするのに十分な担当者を持っていないので、私は答えでこれを書いています。

別のライブラリを使用している場合は、nlohmann jsonはきちんとしたヘッダー専用ライブラリです。ウェブサイト上の例で与えられたよう

、ファイルからの読み込み、文字列にそれを置くことは、私は私が自分自身rapidjson使用していないごめんなさい

// read a JSON file 
std::ifstream i("file.json"); 
json j; 
i >> j; 

std::string s = j.dump(); 

限りシンプルにすることができます。

関連する問題