2017-11-14 20 views
1

PHPでエンコードされたJSON文字列を解析し、TCPを介してC++クライアントに送信しようとしています。jsoncppでJSON文字列を解析する

私のJSON文字列は、このようなものです:C++クライアントで

{"1":{"name":"MIKE","surname":"TAYLOR"},"2":{"name":"TOM","surname":"JERRY"}} 

私は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; 
    } 
} 

問題は、私は出力として何も届かないということです、解析(もしあれば)に関するエラーさえもない。 私が間違っていることを理解するのを助けてくれますか?

+0

を、このコードもコンパイルされません。まず、jsonの文字列をC++の文字列にエスケープする必要があります。大きな文字列が必要な場合は、[link](https://stackoverflow.com/questions/7724448/simple-json-string-escape-for-c)のソリューション – kalimba

+0

@kalimbaを参照してください。あなたは絶対に正しいです。私はTCPストリームを解析していますが、私が書いたコードを説明する文字列を持つ関数を書いています。私はエスケープシーケンスを忘れてしまった。頭をアップしていただきありがとうございます。 – Podarce

答えて

2

問題は次のとおりです。ルート["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; 
    } 
    } 
} 
+0

答えてくれてありがとうございます。私は与えられた答えにいくつかの質問をしてください。 1)なぜこのようなテキスト文字列を書く必要がありますか?私の文字列はPHPのjson_encodeから直接来るので、正しいはずです2)連想配列を "1":{}、 "2":{}としたい場合は、人" ?私は少し混乱しています。 – Podarce

+0

私はコードを編集し、あなたのニーズに合っていることを願っています。 –

+0

コードでいくつかのテストを行ったが、問題はbool parsingSuccessful = reader.parse(text、root); nothingsがその行を過ぎて実行されるように見えます。 Json :: Readerリーダーの非難された使用のためであることができますか?私はコンパイラのエラーがないことに注意してください。 – Podarce