2017-04-07 111 views
1

我有本機構請求示例:JSON陣列具有多個值C++

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

對於前面的示例我接收一個std::list<UsersId>* VUsers具有我的用戶ID(在此情況下「123」和「1234」),創建cJSON array ,重複我的列表並獲取所有userId。 (注:UsersId是我使用和接收構造一個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; 
    } 

但要知道我想的一樣,但使更多的簡單/容易,需要對身體的要求改變這樣的事情:

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

我使用這個C++庫 - >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。所以我需要去用戶對象,並獲取usersId數組內的所有值(可能有一些迭代),並將所有值保存在其他列表中(std :: list * users = new std :: list ();) – Pik93

+0

從我在第2部分看到的,兩個變量是用相同的名稱(userId)定義的。 –

回答

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,這並不需要太多的代碼到第一文檔轉換成第二:

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

嗨。謝謝回覆。我知道,但在這種情況下,我的服務器必須在C++中。請在原始帖子中查看我的編輯2。我把這部分做了json解析,嘗試修改這部分,但它不工作。這部分是在做出更改之後在原身體請求上工作的原始代碼 – Pik93

+0

究竟是什麼「阻抗不匹配」?你指的是指針不能通過JSON或XML表達的事實嗎? –

+0

@ChristianHackl這是它的一部分,但它也是Java或C++是具有一般功能的面向對象的命令式語言,而聲明式查詢語言通常更適合操作數據和語法。SQL是表格數據最着名的例子,大多數C++用戶在連接到關係數據庫時使用SQL,而不是編寫在內存中的表上使用STL迭代器的低級代碼。這還沒有建立樹形數據本身,但這個想法是相似的。我認爲,最實際的論據是所需的代碼行以及可讀性。 –