我正在使用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 } }
答案 0 :(得分:2)
我怀疑root["redis"].get("host", "localhost")
或root["redis"]
会返回Value
,而不是Value
的引用。 Value
对象将一直存在直到表达式结束,在2
的情况下,临时Value
对象将被销毁,将cstr
作为悬空指针。取消引用悬空指针时,行为未定义。
如果是1
,则str
是std::string
返回的asString()
的副本。
对于3
,临时Value
将一直存在,直到表达式结束(;
),允许const char*
返回asCString()
成功处理。
要解决,要么:
cstr
的类型更改为std::string
,并将复制返回的const char*
或Value
返回的get()
的副本,然后查询而不是root[]
。编辑:
根据此source,Value.get()
的所有变体都会返回Value
。所以原因如上所述。