如何使用 rapidjson 读取 json 文件并输出到 std::string?

How to read json file using rapidjson and output to std::string?

如何读取 *.json 文件并将输出放在 std::string 上?

我有这个样本,但我总是在 std::string 上得到 null

#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
}

您需要在转换为 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;
}