C++ 使用 jsoncpp 解析 JSON 字符串
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/47283908/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Parsing JSON string with jsoncpp
提问by Podarce
I'm trying to parse a JSON string encoded with PHP and sent over TCP to a C++ client.
我正在尝试解析用 PHP 编码并通过 TCP 发送到 C++ 客户端的 JSON 字符串。
My JSON strings are like this:
我的 JSON 字符串是这样的:
{"1":{"name":"MIKE","surname":"TAYLOR"},"2":{"name":"TOM","surname":"JERRY"}}
On the C++ client I'm using the jsoncpp libraries:
在 C++ 客户端上,我使用 jsoncpp 库:
void decode()
{
string text = {"1":{"name":"MIKE","surname":"TAYLOR"},"2":{"name":"TOM","surname":"JERRY"}};
Json::Value root;
Json::Reader reader;
bool parsingSuccessful = reader.parse( text, root );
if ( !parsingSuccessful )
{
cout << "Error parsing the string" << endl;
}
const Json::Value mynames = root["name"];
for ( int index = 0; index < mynames.size(); ++index )
{
cout << mynames[index] << endl;
}
}
The problem is that I'm not getting anything as output, not even the error about the parsing(if any). Could you possibly help me to understand what I'm doing wrong ?
问题是我没有得到任何输出,甚至没有关于解析的错误(如果有的话)。你能帮我理解我做错了什么吗?
回答by p-a-o-l-o
Your problem is: there is no root["name"]. Your document should be like this:
你的问题是:没有root["name"]。你的文件应该是这样的:
{ "people": [{"id": 1, "name":"MIKE","surname":"TAYLOR"}, {"id": 2, "name":"TOM","surname":"JERRY"} ]}
And your code like this:
你的代码是这样的:
void decode()
{
string text ="{ \"people\": [{\"id\": 1, \"name\":\"MIKE\",\"surname\":\"TAYLOR\"}, {\"id\": 2, \"name\":\"TOM\",\"surname\":\"JERRY\"} ]}";
Json::Value root;
Json::Reader reader;
bool parsingSuccessful = reader.parse( text, root );
if ( !parsingSuccessful )
{
cout << "Error parsing the string" << endl;
}
const Json::Value mynames = root["people"];
for ( int index = 0; index < mynames.size(); ++index )
{
cout << mynames[index] << endl;
}
}
If you want to keep your data as is:
如果您想按原样保留数据:
void decode()
{
//string text ="{ \"people\": [{\"id\": 1, \"name\":\"MIKE\",\"surname\":\"TAYLOR\"}, {\"id\": 2, \"name\":\"TOM\",\"surname\":\"JERRY\"} ]}";
string text ="{ \"1\": {\"name\":\"MIKE\",\"surname\":\"TAYLOR\"}, \"2\": {\"name\":\"TOM\",\"surname\":\"JERRY\"} }";
Json::Value root;
Json::Reader reader;
bool parsingSuccessful = reader.parse( text, root );
if ( !parsingSuccessful )
{
cout << "Error parsing the string" << endl;
}
for( Json::Value::const_iterator outer = root.begin() ; outer != root.end() ; outer++ )
{
for( Json::Value::const_iterator inner = (*outer).begin() ; inner!= (*outer).end() ; inner++ )
{
cout << inner.key() << ": " << *inner << endl;
}
}
}
Traverse the root object directly, using iterators (don't treat it as it was an array.
使用迭代器直接遍历根对象(不要将其视为数组。
If Json::Readerdoesn't work, try Json::CharReaderinstead:
如果Json::Reader不起作用,请尝试使用Json::CharReader:
void decode()
{
string text ="{\"1\":{\"name\":\"MIKE\",\"surname\":\"TAYLOR\"},\"2\":{\"name\":\"TOM\",\"surname\":\"JERRY\"}}";
Json::CharReaderBuilder builder;
Json::CharReader * reader = builder.newCharReader();
Json::Value root;
string errors;
bool parsingSuccessful = reader->parse(text.c_str(), text.c_str() + text.size(), &root, &errors);
delete reader;
if ( !parsingSuccessful )
{
cout << text << endl;
cout << errors << endl;
}
for( Json::Value::const_iterator outer = root.begin() ; outer != root.end() ; outer++ )
{
for( Json::Value::const_iterator inner = (*outer).begin() ; inner!= (*outer).end() ; inner++ )
{
cout << inner.key() << ": " << *inner << endl;
}
}
}
回答by waynix
You can also read from a stringstream:
您还可以从字符串流中读取:
std::stringstream sstr(stringJson);
Json::Value json;
sstr >> json;