2017-04-07 9 views
1

私はこのボディ要求例えば有する:私は1つ私はuserIdを有するstd::list<UsersId>* VUsers(「123」は、この場合と「1234」)を受信する前たとえばJSON配列++

{ 
    "users": [{ 
     "userId": 123 
    }, { 
     "userId": 1234 
    }] 
} 

を、cJSON arrayを作成します私のリストを繰り返し、すべてのuserIdを取得します。 (注意:UsersIdは、私が使用して1つのAUXILIARクラスで、コンストラクタで1 intを受ける)

cJSON* cJsonUsers = cJSON_CreateArray(); 
cJSON_AddItemToObject(root, "VUsers", cJsonUsers); 

    std::list<UsersId>::const_iterator itUsers = VUsers->begin(); 
    while (itUsers != VUsers->end()) 
    { 
     cJSON *cJsonVNode = cJSON_CreateObject(); 
     cJSON_AddItemToArray(cJsonUsers, cJsonUser); 

     cJSON_AddNumberToObject(cJsonUser, "userId", itUsers->userId); 
     ++itVNodes; 
    } 

しかし、私は同じにしたい知っているが、よりシンプル/簡単に作成し、このような何かに体の要求を変更する必要があります:私はこのCを使用してい

{ 
    "users": { 
     "userId": [123, 1234] 
    } 
} 

++ライブラリ - >https://github.com/DaveGamble/cJSONしかし、私は私が必要な変更を実装するために行う方法を理解しません。

EDIT 2(JSONを構文解析)このような

cJSON* cJsonUsers = cJSON_GetObjectItem(root, "users"); 
if (!cJsonUsers) return 0; 
if (cJsonUsers->type != cJSON_Array) return 0; 

std::list<VUserId>* users = new std::list<VUserId>(); 
cJSON* cJsonVUser; 
cJSON_ArrayForEach(cJsonVUser, cJsonUsers) 
{ 
    cJSON* cJsonVUserId = cJSON_GetObjectItem(cJsonVUser, "userId"); 
    if (!cJsonVUserId) continue; 

int user_id = cJsonVUserId->valueint; 

VUserId userId(user_id); 
users->push_back(userId); 
} 
+0

さらに正確にしてください。 * "私は修正を実装する方法を理解していない" *十分な問題の説明ではありません。それはコンパイルされませんか?そうでない場合、どの行が失敗し、何がエラーメッセージですか?それとも正しい出力が得られないのでしょうか?そうでない場合は、テスト入力は何ですか、期待出力は何ですか?実際の出力は何ですか? –

+0

私はこのコードを理解しており、この部分を実装しています。今私は他の部分(編集2は、ボディ要求の変更の後に動作するコードです)どこjsonを解析する必要があります。だから私はusersオブジェクトに移動し、usersId配列内のすべての値を(おそらくいくつかの反復で)取得し、他のリスト内のすべての値を保存する(std :: list * users = new std :: list ();) – Pik93

+0

パート2で見たように、同じ名前(userId)で2つの変数が定義されています。 –

答えて

0

何か、すなわち、動作ループの外側のオブジェクトと配列を作成し、ループ内の番号を挿入することができ:

cJSON* cJsonUsers = cJSON_CreateObject(); 
cJSON_AddItemToObject(root, "users", cJsonUsers); 

cJSON* cJsonUserId = cJSON_CreateArray(); 
cJSON_AddItemToObject(cJsonUsers, "userId", cJsonUserId); 

std::list<UsersId>::const_iterator itUsers = VUsers->begin(); 
while (itUsers != VUsers->end()) 
{ 
    cJSON_AddItemToArray(cJsonUserId, cJSON_CreateNumber(itUsers->userId)); 
    ++itVNodes; 
} 

柔軟性がある場合は、more convenient to manipulate JSONという言語があります(免責事項:私はこれらのいくつかの設計に関わっていました)。もちろん、C++を使用しなければならず、ライブラリが大変意味をなさないユースケースが常にあります。

C++やJavaなどの言語では、オブジェクト間に古典的な意味でのインピーダンスの不一致があり、XMLやJSONなどのデータ形式があります。たとえば、標準化された宣言的で機能的なXQuery 3.1では、最初のドキュメントを2番目のドキュメントに変換するコードはそれほど必要ありません。

let $original-document := json-doc("users.json") 
return map { 
    "users" : map { 
    "userId" : array { $original-document?users?*?userId } 
    } 
} 
+0

HI。返信いただきありがとうございます。私は知っているが、この場合私のサーバはC++でなければならない。元の投稿の私のEDIT 2を見てください。私はjson構文解析を行う部分を入れて、この部分も修正するようにしますが、動作しません。この部分は、変更後に前の身体要求に作用する元のコードです – Pik93

+0

「インピーダンスのミスマッチ」はどういうものでしょうか?ポインターをJSONやXMLで表現できないという事実を指していますか? –

+0

これは@ChristianHacklですが、JavaやC++は一般的な機能を持つオブジェクト指向の命令型言語であり、宣言型のクエリ言語は一般的にデータや構文を操作するのに適しています。SQLはテーブル型データの最も有名な例です。ほとんどのC++ユーザーは、メモリ内のテーブルにSTLイテレータを使用する低レベルのコードを記述するのではなく、リレーショナルデータベースに接続するときにSQLを使用します。これはまだ木のようなデータのために確立されていませんが、その考え方は似ています。最も実際的な議論は、私が考えると、コードの必要性と読みやすさです。 –