問題は次のとおりです。ルート["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;
}
}
}
を、このコードもコンパイルされません。まず、jsonの文字列をC++の文字列にエスケープする必要があります。大きな文字列が必要な場合は、[link](https://stackoverflow.com/questions/7724448/simple-json-string-escape-for-c)のソリューション – kalimba
@kalimbaを参照してください。あなたは絶対に正しいです。私はTCPストリームを解析していますが、私が書いたコードを説明する文字列を持つ関数を書いています。私はエスケープシーケンスを忘れてしまった。頭をアップしていただきありがとうございます。 – Podarce