Json cpp asCstring() 存储在变量中时返回空字符串

Json cpp asCstring() returns empty cstring when stored in variable

本文关键字:返回 字符串 变量 asCstring cpp 存储 Json      更新时间:2023-10-16

我正在使用Json-cpp来解析我的配置文件,并且使用asCString()得到了奇怪的行为。谁能解释为什么 2 的输出是空的?

#include <iostream>
#include <fstream>
#define JSON_IS_AMALGAMATION
#include "json/json.h"
using std::cout;
using std::endl;
int main(int argc, char** argv) {
    Json::Value root;
    Json::Reader reader;
    std::ifstream config("dev.json", std::ifstream::binary);
    if (!reader.parse(config, root, false)) {
      cout << "Could not parse json" << endl;
      return 1;
    }
    std::string str = root["redis"].get("host", "localhost").asString();
    const char* cstr = root["redis"].get("host", "localhost").asCString();
    cout << "1:" << str << endl;
    cout << "2:" << cstr << endl;
    cout << "3:" << std::string(root["redis"].get("host", "localhost").asCString()) << endl;
    config.close();
    return 0;
}

输出:

c++ -o test test.cpp jsoncpp.cpp
1:127.0.0.2
2:
3:127.0.0.2

我的 json 数据:

{ "redis": { "host": "127.0.0.2", "port": 6379 } }

我怀疑root["redis"].get("host", "localhost")root["redis"]返回Value,而不是对Value的引用。该Value对象将一直存在到表达式结束,在表达式2的情况下,临时Value对象将被销毁,cstr作为悬空指针。取消引用悬空指针时,行为是未定义的。

1的情况下,strasString()返回的std::string的副本。

3的情况下,临时Value将一直存在到表达式(;)结束,允许asCString()返回的const char*被成功处理。

要解决以下任一问题:

  • cstr类型更改为std::string,它将复制返回的const char*,或
  • 制作get()返回的Value的副本并查询它而不是root[]

编辑:

基于此源,Value.get()的所有变体都返回一个Value。所以原因如前所述。