首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用cJSON.h创建json对象

使用cJSON.h创建json对象
EN

Stack Overflow用户
提问于 2017-08-16 16:50:35
回答 3查看 14K关注 0票数 6

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

代码语言:javascript
复制
"CarType": "mercedes",
"carID": "merc123"

还有其他的项目。

我想像这样创建JSON:

代码语言:javascript
复制
{
  cars: [
    {
      "CarType": "BMW",
      "carID": "bmw123"
    },
    {
      "CarType": "mercedes",
      "carID": "merc123"
    },
    {
      "CarType": "volvo",
      "carID": "vol123r"
    },
    {
      "CarType": "ford",
      "carID": "ford123"
    }
  ]
};

到目前为止我已经尝试过了:

代码语言:javascript
复制
#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;
}

我的输出如下所示(缩进与此处所示完全相同):

代码语言:javascript
复制
[{
        "CarType":  "BMW",
        "carID":    "bmw123"
    }]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-16 17:44:25

下面的代码将向您展示如何使用cJSON_CreateObject()cJSON_CreateArray()cJSON_AddItemToObject()cJSON_AddItemToArray()等cJSON函数。

您必须向root对象添加cars数组。之后,您必须将每个car创建为包含CarTypecarID项的对象。必须将每个car对象添加到cars数组中。

示例here at GitHub也很好地说明了这一点。

编辑#1:

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

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

编辑#2:

@lsalamon提到,你必须释放cJSON_Print的返回值,参见here on SO for examplethe documentation

代码:

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
{
    "cars": [{
            "CarType":  "BMW",
            "carID":    "bmw123"
        }, {
            "CarType":  "mercedes",
            "carID":    "mercedes123"
        }]
}

这段代码只是添加了2辆汽车来显示使用情况。在实际的应用程序中,您应该使用C数组和for循环来做到这一点。

票数 14
EN

Stack Overflow用户

发布于 2017-08-16 17:24:09

如果json字符串是固定的,你可以简单地使用cJSON_Parse函数,为此你需要有它的char*

代码语言:javascript
复制
   const char* const json_string = 
"{ \
  \"cars\": [\
    {\
      \"CarType\": \"BMW\",\
      \"carID\": \"bmw123\"\
    },\
    {\
      \"CarType\": \"mercedes\",\
      \"carID\": \"merc123\"\
    },\
    {\
      \"CarType\": \"volvo\",\
      \"carID\": \"vol123r\"\
    },\
    {\
      \"CarType\": \"ford\",\
      \"carID\": \"ford123\"\
    }\
  ]\
}\
";

   cJSON * root = cJSON_Parse(json_string);  /* Play with root */

   //char *rendered = cJSON_Print(root);

根据请求更新,当输入数组不是固定的时为

代码语言:javascript
复制
   const char* const carType[] ={"BMW", "Mercides", "Audi", "Farari"}; 
   const char* const carID[]  ={"bmw11", "m22", "a33", "f44"} ;

   size_t max_size = 4;
   cJSON *root,*car;

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

   for( size_t i = 0; i < max_size; ++i )
   {
      cJSON* item  = cJSON_CreateObject(); 
      cJSON_AddItemToObject(item, "CarType", cJSON_CreateString( carType[i] ));
      cJSON_AddItemToObject(item, "carID", cJSON_CreateString(carID[i]));

      cJSON_AddItemToArray(car, item);
   }


   cJSON_AddItemToObject( root, "cars", car );
票数 1
EN

Stack Overflow用户

发布于 2017-08-16 17:51:44

我得到的另一个解决方案-

代码语言:javascript
复制
#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("bmws123"));
    cJSON_AddItemToArray(car, root);

    root=NULL;
    root  = cJSON_CreateObject();

    cJSON_AddItemToObject(root, "CarType", cJSON_CreateString("Mercedies"));
    cJSON_AddItemToObject(root, "carID", cJSON_CreateString("mer123"));
    cJSON_AddItemToArray(car, root);



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


    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45709054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档