Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 650 Vote(s) - 3.6 Average
  • 1
  • 2
  • 3
  • 4
  • 5
create json object using cJSON.h

#1
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"
}]


Reply

#2
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 );
Reply

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

#4
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](

[To see links please register here]

).

**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](

[To see links please register here]

) and [the documentation](

[To see links please register here]

).

**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.
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through