3

我想rapidjson::Value从 JSON 字符串创建一个,例如[1,2,3]. 注意:这不是一个完整的 JSON 对象,它只是一个 JSON 数组。在 Java 中,我可以使用从字符串objectMapper.readTree("[1,2,3]")创建一个。JsonNode

我完整的 C++ 代码如下:

#include <rapidjson/document.h>
#include <rapidjson/stringbuffer.h>
#include <rapidjson/writer.h>
#include <iostream>

// just for debug
static void print_json_value(const rapidjson::Value &value) {
    rapidjson::StringBuffer buffer;
    rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
    value.Accept(writer);

    std::cout << buffer.GetString() << std::endl;
}

//TODO: this function probably has a problem
static rapidjson::Value str_to_json(const char* json) {
    rapidjson::Document document;
    document.Parse(json);
    return std::move(document.Move());
}


int main(int argc, char* argv[]) {
    const char* json_text = "[1,2,3]";

    // copy the code of str_to_json() here
    rapidjson::Document document;
    document.Parse(json_text);
    print_json_value(document);  // works

    const rapidjson::Value json_value = str_to_json(json_text);
    assert(json_value.IsArray());
    print_json_value(json_value);  // Assertion failed here

    return 0;
}

谁能找出我函数中的问题str_to_json()

PS:上面的代码适用于 GCC 5.1.0,但不适用于 Visual Studio Community 2015。

更新

根据@Milo Yip的建议,正确的代码如下:

#include <rapidjson/document.h>
#include <rapidjson/stringbuffer.h>
#include <rapidjson/writer.h>
#include <iostream>

static void print_json_value(const rapidjson::Value &value) {
    rapidjson::StringBuffer buffer;
    rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
    value.Accept(writer);

    std::cout << buffer.GetString() << std::endl;
}

static rapidjson::Document str_to_json(const char* json) {
    rapidjson::Document document;
    document.Parse(json);
    return std::move(document);
}


int main(int argc, char* argv[]) {
    const char* json_text = "[1,2,3]";

    // copy the code of str_to_json() here
    rapidjson::Document document;
    document.Parse(json_text);
    print_json_value(document);  // works

    const rapidjson::Document json_value = str_to_json(json_text);
    assert(json_value.IsArray());
    print_json_value(json_value);  // Now works

    return 0;
}
4

1 回答 1

6

简单的回答:返回类型应该是rapidjson::Document而不是rapidjson::Value.

更长的版本:ADocument包含一个分配器,用于在解析期间存储所有值。当返回Value(实际上是树的根)时,本地Document对象将被破坏,分配器中的缓冲区将被释放。它就像std::string s = ...; return s.c_str();一个函数内部。

于 2015-09-24T03:13:48.853 回答