2017-04-07 112 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迭代器的低级代码。这还没有建立树形数据本身,但这个想法是相似的。我认为,最实际的论据是所需的代码行以及可读性。 –