我正在尝试创建如下所示的JSON对象,但我无法在其中添加第二项,例如:
"CarType": "mercedes",
"carID": "merc123"还有其他的项目。
我想像这样创建JSON:
{
cars: [
{
"CarType": "BMW",
"carID": "bmw123"
},
{
"CarType": "mercedes",
"carID": "merc123"
},
{
"CarType": "volvo",
"carID": "vol123r"
},
{
"CarType": "ford",
"carID": "ford123"
}
]
};到目前为止我已经尝试过了:
#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;
}我的输出如下所示(缩进与此处所示完全相同):
[{
"CarType": "BMW",
"carID": "bmw123"
}]发布于 2017-08-16 17:44:25
下面的代码将向您展示如何使用cJSON_CreateObject()、cJSON_CreateArray()、cJSON_AddItemToObject()和cJSON_AddItemToArray()等cJSON函数。
您必须向root对象添加cars数组。之后,您必须将每个car创建为包含CarType和carID项的对象。必须将每个car对象添加到cars数组中。
示例here at GitHub也很好地说明了这一点。
编辑#1:
正如@JonnySchubert指出的那样,有必要释放分配的资源。但在这种情况下,释放根节点就足够了,因为将一项添加到数组或对象会转移它的所有权。换句话说:释放根节点也会导致释放根下的所有节点。来自我上面链接的GitHub资源:
对于每个值类型,都有一个cJSON_Create...函数可用于创建该类型的项。所有这些都将分配一个稍后可以用cJSON_Delete删除的cJSON结构。请注意,您必须在某些时候删除它们,否则将导致内存泄漏。重要提示:如果你已经在数组或对象中添加了一项,你不能用 cJSON_Delete来删除它。将其添加到数组或对象会转移其所有权,因此当该数组或对象被删除时,它也会被删除。
编辑#2:
@lsalamon提到,你必须释放cJSON_Print的返回值,参见here on SO for example和the documentation。
代码:
#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;
}输出:
{
"cars": [{
"CarType": "BMW",
"carID": "bmw123"
}, {
"CarType": "mercedes",
"carID": "mercedes123"
}]
}这段代码只是添加了2辆汽车来显示使用情况。在实际的应用程序中,您应该使用C数组和for循环来做到这一点。
发布于 2017-08-16 17:24:09
如果json字符串是固定的,你可以简单地使用cJSON_Parse函数,为此你需要有它的char*:
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);根据请求更新,当输入数组不是固定的时为
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 );发布于 2017-08-16 17:51:44
我得到的另一个解决方案-
#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;
}https://stackoverflow.com/questions/45709054
复制相似问题