c - 在C中使用for循环格式化Json数组中的json对象

标签 c json

我试图格式化一个 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/

相关文章:

c - 我在 OSX 上的 gcc 中不断得到 "Segmentation fault: 11",但在 Windows 上工作

c - 理解内存中的结构

php - 获取 JSON 对象的第一个条目

javascript - 将 json 对象转换为 HTML 的最佳解决方案

c - json_decref() 导致内存无效写入

c# - 解析 JSON 对象数组

c - 绑定(bind)失败: Address already in use

c - 在不知道元素数量的情况下迭代准备好的结构体数组 c 的正确简单声明

Python解析json问题

c - 自定义 strcmp 中的奇怪错误 (C)