我有这个身体请求示例:
{
"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);
}
这样的东西可以工作,也就是说,在循环外创建对象和数组,并在循环中插入数字:
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 }
}
}