我试图格式化一个 json 数组并将其发送到服务器。我已经尝试了下面的代码并得到了正确的字符串输出。
json_t* json_arr = json_array();
json_t* json_request = json_object();
json_t* json_request1 = json_object();
json_t* host = json_object();
json_t* host1 = json_object();
char *buf;
json_object_set_new(json_request, "mac", json_string("005056BD3B6C"));
json_object_set_new(host, "os_type", json_string("Linux_Fedora"));
json_object_set_new(host, "user_agent", json_string("Wget/1.10.2 (Fedora modified)"));
json_object_set_new(json_request1, "mac", json_string("005056BD3B60"));
json_object_set_new(host1, "os_type", json_string("Linux_Fedora"));
json_object_set_new(host1, "user_agent", json_string("Wget/1.10.2 (Fedora modified)"));
json_object_set_new(json_request ,"host", host);
json_object_set_new(json_request1 ,"host", host1);
json_array_append(json_arr ,json_request);
json_array_append(json_arr ,json_request1);
buf = json_dumps(json_arr ,JSON_PRESERVE_ORDER);
输出:
[
{
"mac":"005056BD3B6C",
"host":{
"os_type":"Linux_Fedora",
"user_agent":"Wget/1.10.2 (Fedora modified)"
}
},
{
"mac":"005056BD3B60",
"host":{
"os_type":"Linux_Fedora",
"user_agent":"Wget/1.10.2 (Fedora modified)"
}
}
]
<小时/>
我想根据我的要求将上面的代码放入循环中。所以我尝试了下面的代码。
json_t* json_arr = json_array();
char *buf;
const char *str[3];
str[0] = "005056b4800c";
str[1] = "005056b4801c";
str[2] = "005056b4802c";
for (i=0;i<3;i++)
{
json_t* json_request = json_object();
json_t* host = json_object();
json_object_set_new(json_request, "mac", json_string(str[i]));
json_object_set_new(host, "os_type", json_string("Linux_Fedora"));
json_object_set_new(host, "user_agent", json_string("Wget/1.10.2 (Fedora modified)"));
json_object_set_new(json_request ,"host", host);
json_array_append(json_arr ,json_request);
json_decref(json_request);
json_decref(host);
}
buf = json_dumps(json_arr ,JSON_PRESERVE_ORDER);
这里我得到了以下缓冲区值:
[
{
"mac":"005056b4800c",
"host":{
"mac":"005056b4801c",
"host":{
"mac":"005056b4802c",
"host":{
}
}
}
},
{
"mac":"005056b4801c",
"host":{
"mac":"005056b4802c",
"host":{
}
}
},
{
"mac":"005056b4802c",
"host":{
}
}
]
如何使用循环并格式化与上面相同的数组?
最佳答案
由于您似乎正在使用 Jansson 库,因此您应该查看引用计数。
json_object_set_new(json_request ,"host", host);
json_array_append(json_arr ,json_request);
json_decref(json_request);
json_decref(host);
json_object_set_new
“窃取”所添加对象的引用。这意味着添加到父对象时,host
的引用计数器不会增加。
如果您手动递减计数器,该对象将被释放。
这会导致一个空/无效的对象。
json_request
已释放,Host
将被释放。
递减 json_request
的计数器是可以的,因为 json_array_append
会递增计数器。
关于c - 在C中使用for循环格式化Json数组中的json对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45097918/