create json object using cJSON.h
Asked Answered
P

3

8

I am trying to create JSON object like below but I am not able to add the second item in it e.g:

"CarType": "mercedes",
"carID": "merc123"

and also other items.

I want to create JSON like this:

{
  cars: [
    {
      "CarType": "BMW",
      "carID": "bmw123"
    },
    {
      "CarType": "mercedes",
      "carID": "merc123"
    },
    {
      "CarType": "volvo",
      "carID": "vol123r"
    },
    {
      "CarType": "ford",
      "carID": "ford123"
    }
  ]
};

I have tried so far:

#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;
}

My Output is something like this (indentation is exactly as showed here):

[{
        "CarType":  "BMW",
        "carID":    "bmw123"
    }]
Pallet answered 16/8, 2017 at 8:50 Comment(5)
and what is the question...?Rubble
Welcome to StackOverflow. Unfortunately this is neither a tutorial site nor web search replacement. We can help solve certain problems, but it's your job to put some efforts in the first place, incl. elementary (re)searchMcintosh
Edit your question to show us what you have tried and what the actual problem is.Cheryllches
And what is the problem/output?Cheryllches
Marcin Orlowski - for your info i am putting effort before asking the question & after posting it until i got the answer. and thanks for letting me know that this is not the tutorial site.by the way i got the answer .Pallet
C
17

The following code will show you how to use the cJSON functions like cJSON_CreateObject(), cJSON_CreateArray(), cJSON_AddItemToObject() and cJSON_AddItemToArray().

You have to add the cars array to the root object. After that you have to create each car as object containing items which are the CarType and carID. Each car object has to be added to the cars array.

It it also very well documentated with examples here at GitHub.

Edit #1:

As @JonnySchubert pointed out, it's necessary to free allocated ressources. But it's enough to free the root node in this case, because adding an item to an array or object transfers it's ownership. In other words: freeing the root node will cause freeing all nodes under root also. From the GitHub ressource I linked above:

For every value type there is a cJSON_Create... function that can be used to create an item of that type. All of these will allocate a cJSON struct that can later be deleted with cJSON_Delete. Note that you have to delete them at some point, otherwise you will get a memory leak. Important: If you have added an item to an array or an object already, you mustn't delete it with cJSON_Delete. Adding it to an array or object transfers its ownership so that when that array or object is deleted, it gets deleted as well.

Edit #2:

@lsalamon mentioned that you have to free the return value of cJSON_Print, see here on SO for example and the documentation.

Code:

#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;
}

Output:

{
    "cars": [{
            "CarType":  "BMW",
            "carID":    "bmw123"
        }, {
            "CarType":  "mercedes",
            "carID":    "mercedes123"
        }]
}

This code just add 2 cars to show the usage. In your real application you should do that with C arrays and a for loop.

Cheryllches answered 16/8, 2017 at 9:44 Comment(3)
Thanks for your time & effort.Pallet
Never forget to free dynamic memory at the end by calling cJSON_Delete(root) and to free the string allocated by cJSON.Hobson
Calling free (out) is required or memory leak will occur.Mopey
L
1

If the json string is fixed you could simply use cJSON_Parse function, to do that you need to have the char* to it :

   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);

Updated as per request , when input array is not fixed:

   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 );
Labdanum answered 16/8, 2017 at 9:24 Comment(4)
it is not Fixed it will come from some string array.Pallet
string carType[]={"BMW", "Mercides", "Audi", "Farari"}; string carID[]={"bmw11", "m22", "a33", "f44"};Pallet
@Pallet You need to mention this in your post, we don't have psychic ability to read people mind.Labdanum
@Pallet Updated my post.Labdanum
P
0

Another solution i got -

#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;
}
Pallet answered 16/8, 2017 at 9:51 Comment(1)
Yes would work but names are wrong in usage here as you using root not as root object. Further you have just an array car without a root object.Cheryllches

© 2022 - 2024 — McMap. All rights reserved.