我正在尝试解析用PHP编码并通过TCP发送到C ++客户端的JSON字符串。
我的JSON字符串如下所示:
{"1":{"name":"MIKE","surname":"TAYLOR"},"2":{"name":"TOM","surname":"JERRY"}}
在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; } }
问题是我没有得到任何输出,甚至没有关于解析的错误(如果有)。你能帮我了解我做错了什么吗?
您的问题是:没有 root [“ name”] 。您的文档应如下所示:
{ "people": [{"id": 1, "name":"MIKE","surname":"TAYLOR"}, {"id": 2, "name":"TOM","surname":"JERRY"} ]}
和你的代码是这样的:
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; } }
如果您想按原样保留数据:
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; } } }
使用迭代器直接遍历根对象(不要将其视为数组。
如果 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; } } }