C++ RapidJSON Writer 和 String Buffer 输出未知字符

标签 c++ json rapidjson

我有一个表示 3-space 中对象的类,以及一个 to_json 方法,该方法输出一个 const char* 以将对象转换为 JSON,以便写回基于文档的数据库。但是,to_json 方法输出的是未知字符而不是 JSON 消息

const char* Obj3::to_json() const
{
    logging->info("Obj3:To JSON Called");
    //Initialize the string buffer and writer
    StringBuffer s;
    Writer<StringBuffer> writer(s);

    //Start writing the object
    //Syntax taken directly from
    //simplewriter.cpp in rapidjson examples

    writer.StartObject();

    writer.Key("key");
    std::string key = get_key();
    writer.String( key.c_str(), (SizeType)key.length() );

    writer.Key("owner");
        std::string owner_dev = get_owner();
        writer.String( owner_dev.c_str(), (SizeType)owner_dev.length() );

    writer.Key("name");
    std::string name = get_name();
    writer.String( name.c_str(), (SizeType)name.length() );

    writer.Key("type");
    std::string type = get_type();
    writer.String( type.c_str(), (SizeType)type.length() );

    writer.Key("subtype");
    std::string subtype = get_subtype();
    writer.String( subtype.c_str(), (SizeType)subtype.length() );

    int i;
    int j;

    writer.Key("location");
    writer.StartArray();
    for (i=0; i<3; i++) {
        writer.Double( static_cast<double>(get_loc(i)) );
    }
    writer.EndArray();

    writer.Key("transform");
    writer.StartArray();

        for (i=0; i<4; i++) {
        writer.StartArray();
        for (j=0; j<4; j++) {
                writer.Double( static_cast<double>(transform_matrix(i, j) ));
        }
        writer.EndArray();
        }

        writer.EndArray();

    writer.Key("scenes");
    writer.StartArray();
        for (i=0; i<num_scenes(); i++) {
        std::string sc = get_scene(i);
                writer.String( sc.c_str(), (SizeType)sc.length() );
        }
        writer.EndArray();

    writer.Key("locked");
    writer.Bool(is_locked);

    writer.EndObject();

    //The Stringbuffer now contains a json message
    //of the object
    if (writer.IsComplete()) {
        logging->debug("Valid JSON Encountered");
        try {
            return s.GetString();
        }
        catch (std::exception& e) {
            logging->error("Exception Encountered parsing JSON");
            logging->error(e.what());
        }
    }
    else {
        return "";
    }

}

日志显示以下输出:

2016-04-30 13:15:54,151 [INFO] Obj3:To JSON Called
2016-04-30 13:15:54,151 [DEBUG] Valid JSON Encountered
��

我已经关闭了所有数组和根对象,并且正在根据 API 检查完整性,但是无法通过 std::cout 或 log4cpp 读取输出。

--编辑--

根据以下响应,我将返回类型更新为 std::string 并将返回语句更新为以下内容:

//The Stringbuffer now contains a json message
//of the object
if (writer.IsComplete()) {
    logging->debug("Valid JSON Encountered");
    try {
        const char* ret_val = s.GetString();
        std::string ret_string (ret_val);
        return ret_string;
    }
    catch (std::exception& e) {
        logging->error("Exception Encountered parsing JSON");
        logging->error(e.what());
    }
}
else {
    return "";
}

这会导致段错误。

测试中调用方法如下:

std::cout << obj.to_json() << std::endl;

最佳答案

const char * 返回值指向堆栈上的 s 值。在您使用它之前它会被释放。

相反,考虑使函数返回保留其存储空间的字符串类型(例如 std::string)。

关于C++ RapidJSON Writer 和 String Buffer 输出未知字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36958028/

相关文章:

c++ - 我如何取消声明 DECLARE_HANDLE?

c++ - 在 C++ 中扩展容器(如 std::vector)的功能而不继承它的正确方法?

c++ - 为什么在 C 程序中从 main() 返回 0?

ruby-on-rails - 在 Rails 中使用 `JSON.decode` 的结果

c++ - 静态库中变量的 init_priority 属性

javascript - 单击按钮加载新的 json url 并更新 Angular 中的 View

javascript - 将对象的数组属性发送到 Ajax

c++ - 有没有办法有效地将 rapidjson 与 std::string 一起使用?

c++ - 查找所有键 JSON - RapidJSON

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