具有多个值c ++的JSON数组

问题描述 投票:1回答:1

我有这个身体请求示例:

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

对于前面的示例,我收到一个std::list<UsersId>* VUsers,它有我的userId(在本例中为'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但我不明白如何实现我需要的修改。

编辑2(PARSE THE 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);
}
c++ json cjson
1个回答
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 }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.