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(解析 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);
}
4

1 回答 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;
}

请注意,如果您有灵活性,那么有些语言可以更方便地操作 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 }
  }
}
于 2017-04-07T14:58:20.233 回答