2017-07-21 97 views
0

如何讀取*.json文件並將輸出放在std::string上?如何使用rapidjson讀取json文件並輸出到std :: string?

我有這個樣本,但我總是得到nullstd::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',那麼你不需要一個quickjson。 – 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是一個整齊的,只有標題的庫。

如在網站上給出的例子,從文件中讀取並把它轉換成字符串可以是簡單的

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

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

對不起,我沒用過rapidjson自己。

相關問題