使用cJSON.h创建json对象

Abh*_*hek 3 c json cjson

我正在尝试创建如下的JSON对象,但我无法在其中添加第二项,例如:

"CarType": "mercedes",
"carID": "merc123"
Run Code Online (Sandbox Code Playgroud)

以及其他项目.

我想像这样创建JSON:

{
  cars: [
    {
      "CarType": "BMW",
      "carID": "bmw123"
    },
    {
      "CarType": "mercedes",
      "carID": "merc123"
    },
    {
      "CarType": "volvo",
      "carID": "vol123r"
    },
    {
      "CarType": "ford",
      "carID": "ford123"
    }
  ]
};
Run Code Online (Sandbox Code Playgroud)

我到目前为止尝试过:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"

int main (void){
    char field_name[32], value[32], *out;
    cJSON *root,*car;

    root  = cJSON_CreateObject();
    car=  cJSON_CreateArray();

    cJSON_AddItemToObject(root, "CarType", cJSON_CreateString("BMW"));
    cJSON_AddItemToObject(root, "carID", cJSON_CreateString("bmw123"));
    cJSON_AddItemToArray(car, root);

    out = cJSON_Print(car);
    printf("%s\n",out);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的输出是这样的(缩进完全如此处所示):

[{
        "CarType":  "BMW",
        "carID":    "bmw123"
    }]
Run Code Online (Sandbox Code Playgroud)

And*_*ing 7

下面的代码将告诉你如何使用cJSON功能,如cJSON_CreateObject(),cJSON_CreateArray(),cJSON_AddItemToObject()cJSON_AddItemToArray().

您必须将该cars数组添加到该root对象.之后,你必须创建各自car为它们包含的对象项目CarTypecarID.每个car对象都必须添加到cars数组中.

它也很好地通过GitHub上的示例进行记录.

编辑#1:

正如@JonnySchubert指出的那样,有必要释放分配的资源.但是在这种情况下释放根节点就足够了,因为向数组或对象添加项会转移它的所有权.换句话说:释放根节点也会导致释放root下的所有节点.从我上面链接的GitHub资源:

对于每种值类型,都有一个cJSON_Create...可用于创建该类型项的函数.所有这些都将分配一个cJSON稍后可以删除的结构cJSON_Delete.请注意,您必须在某些时候删除它们,否则会出现内存泄漏.重要说明:如果已将项添加到数组或对象中,则不能将其删除cJSON_Delete.将其添加到数组或对象会转移其所有权,以便在删除该数组或对象时,它也会被删除.

码:

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"

int main()
{
   char *out;
   cJSON *root, *cars, *car;

   /* create root node and array */
   root = cJSON_CreateObject();
   cars = cJSON_CreateArray();

   /* add cars array to root */
   cJSON_AddItemToObject(root, "cars", cars);

   /* add 1st car to cars array */
   cJSON_AddItemToArray(cars, car = cJSON_CreateObject());
   cJSON_AddItemToObject(car, "CarType", cJSON_CreateString("BMW"));
   cJSON_AddItemToObject(car, "carID", cJSON_CreateString("bmw123"));

   /* add 2nd car to cars array */
   cJSON_AddItemToArray(cars, car = cJSON_CreateObject());
   cJSON_AddItemToObject(car, "CarType", cJSON_CreateString("mercedes"));
   cJSON_AddItemToObject(car, "carID", cJSON_CreateString("mercedes123"));

   /* print everything */
   out = cJSON_Print(root);
   printf("%s\n", out);
   free(out);

   /* free all objects under root and root itself */
   cJSON_Delete(root)

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

{
    "cars": [{
            "CarType":  "BMW",
            "carID":    "bmw123"
        }, {
            "CarType":  "mercedes",
            "carID":    "mercedes123"
        }]
}
Run Code Online (Sandbox Code Playgroud)

此代码只添加2辆车来显示用法.在您的实际应用程序中,您应该使用C数组和for循环.