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

时间:2017-07-14 08:09:13

标签: 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":{  

      }
   }
]

如何使用循环并格式化与上面相同的数组?

1 个答案:

答案 0 :(得分:0)

看起来你正在使用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的引用计数器在添加到父对象时不会递增。 如果您手动递减计数器,该对象将被释放。 这会导致空/无效对象。

如果外部Host已免费,

json_request将免费使用。

减少json_request的计数器是正常的,因为json_array_append会递增计数器。