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

时间:2017-07-21 23:40:09

标签: c++ rapidjson

如何阅读*.json文件并将输出放在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 个答案:

答案 0 :(得分:5)

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