PHPでエンコードされ、C++クライアントにTCPで送信された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;
}
}
}
文字列ストリームから読み取ることもできます。
std::stringstream sstr(stringJson);
Json::Value json;
sstr >> json;