一、cJSON的介绍
cJSON是一个开源的JSON解析器,用于解析JSON数据。它是由纯C语言实现,因此跨平台性好,移植简单。
下载地址:
https://github.com/DaveGamble/cJSON.githttps://gitee.com/du-yueqiang/cJSON?_from=gitee_search
二、移植方法
cJSON只有一个cjson.c和cjson.h文件,可以很方便地集成到其他项目中。cJSON支持将JSON数据解析为cJSON对象,也支持将cJSON对象转换为JSON数据。cJSON的使用非常简单,只需要包含cjson.h头文件,然后调用相应的API即可完成JSON数据的解析和生成。
三、测试代码
//根据官方代码修改,创建json格式数据(字符串、整形、数组)//增加了json数据解析功能#include <stdio.h>#include <stdlib.h>#include <string.h>#include "cJSON.h"/* Used by some code below as an example datatype. */struct record{ const char *precision; double lat; double lon; const char *address; const char *city; const char *state; const char *zip; const char *country;};/* Create a bunch of objects as demonstration. */static int print_preallocated(cJSON *root){ /* declarations */ char *out = NULL; char *buf = NULL; char *buf_fail = NULL; size_t len = 0; size_t len_fail = 0; /* formatted print */ out = cJSON_Print(root); /* create buffer to succeed */ /* the extra 5 bytes are because of inaccuracies when reserving memory */ len = strlen(out) + 5; buf = (char*)malloc(len); if (buf == NULL) { printf("Failed to allocate memory./n"); exit(1); } /* create buffer to fail */ len_fail = strlen(out); buf_fail = (char*)malloc(len_fail); if (buf_fail == NULL) { printf("Failed to allocate memory./n"); exit(1); } /* Print to buffer */ if (!cJSON_PrintPreallocated(root, buf, (int)len, 1)) { printf("cJSON_PrintPreallocated failed!/n"); if (strcmp(out, buf) != 0) { printf("cJSON_PrintPreallocated not the same as cJSON_Print!/n"); printf("cJSON_Print result:/n%s/n", out); printf("cJSON_PrintPreallocated result:/n%s/n", buf); } free(out); free(buf_fail); free(buf); return -1; } /* success */ printf("%s/n", buf); /* force it to fail */ if (cJSON_PrintPreallocated(root, buf_fail, (int)len_fail, 1)) { printf("cJSON_PrintPreallocated failed to show error with insufficient memory!/n"); printf("cJSON_Print result:/n%s/n", out); printf("cJSON_PrintPreallocated result:/n%s/n", buf_fail); free(out); free(buf_fail); free(buf); return -1; } free(out); free(buf_fail); free(buf); return 0;}/* Create a bunch of objects as demonstration. */static void create_objects(void){ /* declare a few. */ cJSON *root = NULL; cJSON *fmt = NULL; cJSON *img = NULL; cJSON *thm = NULL; cJSON *fld = NULL; int i = 0; int n; /* Our "days of the week" array: */ const char *strings[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; /* Our matrix: */ int numbers[3][3] = { {0, -1, 0}, {1, 0, 0}, {0 ,0, 1} }; /* Our "gallery" item: */ int ids[4] = { 116, 943, 234, 38793 }; /* Our array of "records": */ struct record fields[2] = { { "zip", 37.7668, -1.223959e+2, "", "SAN FRANCISCO", "CA", "94107", "US" }, { "zip", 37.371991, -1.22026e+2, "", "SUNNYVALE", "CA", "94085", "US" } }; volatile double zero = 0.0; /* Here we construct some JSON standards, from the JSON site. */ /* Our "Video" datatype: */ root = cJSON_CreateObject(); cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (/"Bee/") Nimble")); cJSON_AddItemToObject(root, "format", fmt = cJSON_CreateObject()); cJSON_AddStringToObject(fmt, "type", "rect"); cJSON_AddNumberToObject(fmt, "width", 1920); cJSON_AddNumberToObject(fmt, "height", 1080); cJSON_AddFalseToObject (fmt, "interlace"); cJSON_AddNumberToObject(fmt, "frame rate", 24); /* Print to text */ if (print_preallocated(root) != 0) { cJSON_Delete(root); exit(EXIT_FAILURE); } cJSON *name=cJSON_GetObjectItem(root,"name"); if (cJSON_IsString(name) && (name->valuestring != NULL)) { printf("name is /"%s/"/n", name->valuestring); } cJSON *format=cJSON_GetObjectItem(root,"format"); if (cJSON_IsObject(format) && (format != NULL)) { if (print_preallocated(format) != 0) { cJSON_Delete(root); exit(EXIT_FAILURE); } cJSON *type=cJSON_GetObjectItem(format,"type"); if (cJSON_IsString(type) && (type->valuestring != NULL)) { printf("type is /"%s/"/n", type->valuestring); } cJSON *width=cJSON_GetObjectItem(format,"width"); if (cJSON_IsNumber(width)) { printf("width is %d/n", width->valueint); } cJSON *interlace=cJSON_GetObjectItem(format,"interlace"); if (cJSON_IsBool(interlace)) { printf("interlace is %d/n", interlace->valueint); } } cJSON_Delete(root); /* Our "days of the week" array: */ root = cJSON_CreateStringArray(strings, 7); if (print_preallocated(root) != 0) { cJSON_Delete(root); exit(EXIT_FAILURE); } n=cJSON_GetArraySize(root); cJSON *day; for(i=0;i<n;i++) { day=cJSON_GetArrayItem(root,i); if (cJSON_IsString(day) && (day->valuestring != NULL)) { printf("day is /"%s/"/n", day->valuestring); } } cJSON_Delete(root); /* Our matrix: */ root = cJSON_CreateArray(); for (i = 0; i < 3; i++) { cJSON_AddItemToArray(root, cJSON_CreateIntArray(numbers[i], 3)); } /* cJSON_ReplaceItemInArray(root, 1, cJSON_CreateString("Replacement")); */ if (print_preallocated(root) != 0) { cJSON_Delete(root); exit(EXIT_FAILURE); } n=cJSON_GetArraySize(root); cJSON *num; for(i=0;i<n;i++) { num=cJSON_GetArrayItem(root,i); int m=cJSON_GetArraySize(num); for(int k=0;k<m;k++) { cJSON *j=cJSON_GetArrayItem(num,k); if (cJSON_IsNumber(j) ) { printf("day is %d/n", j->valueint); } } } cJSON_Delete(root); /* Our "gallery" item: */ root = cJSON_CreateObject(); cJSON_AddItemToObject(root, "Image", img = cJSON_CreateObject()); cJSON_AddNumberToObject(img, "Width", 800); cJSON_AddNumberToObject(img, "Height", 600); cJSON_AddStringToObject(img, "Title", "View from 15th Floor"); cJSON_AddItemToObject(img, "Thumbnail", thm = cJSON_CreateObject()); cJSON_AddStringToObject(thm, "Url", "http:/*www.example.com/image/481989943"); cJSON_AddNumberToObject(thm, "Height", 125); cJSON_AddStringToObject(thm, "Width", "100"); cJSON_AddItemToObject(img, "IDs", cJSON_CreateIntArray(ids, 4)); if (print_preallocated(root) != 0) { cJSON_Delete(root); exit(EXIT_FAILURE); } cJSON_Delete(root); /* Our array of "records": */ root = cJSON_CreateArray(); for (i = 0; i < 2; i++) { cJSON_AddItemToArray(root, fld = cJSON_CreateObject()); cJSON_AddStringToObject(fld, "precision", fields[i].precision); cJSON_AddNumberToObject(fld, "Latitude", fields[i].lat); cJSON_AddNumberToObject(fld, "Longitude", fields[i].lon); cJSON_AddStringToObject(fld, "Address", fields[i].address); cJSON_AddStringToObject(fld, "City", fields[i].city); cJSON_AddStringToObject(fld, "State", fields[i].state); cJSON_AddStringToObject(fld, "Zip", fields[i].zip); cJSON_AddStringToObject(fld, "Country", fields[i].country); } /* cJSON_ReplaceItemInObject(cJSON_GetArrayItem(root, 1), "City", cJSON_CreateIntArray(ids, 4)); */ if (print_preallocated(root) != 0) { cJSON_Delete(root); exit(EXIT_FAILURE); } cJSON_Delete(root); root = cJSON_CreateObject(); cJSON_AddNumberToObject(root, "number", 1.0 / zero); if (print_preallocated(root) != 0) { cJSON_Delete(root); exit(EXIT_FAILURE); } cJSON_Delete(root);}int CJSON_CDECL main(void){ /* print the version */ printf("Version: %s/n", cJSON_Version()); /* Now some samplecode for building objects concisely: */ create_objects(); return 0;}
四、实验结果
执行之后,打印如下信息
Version: 1.7.16{ "name": "Jack (/"Bee/") Nimble", "format": { "type": "rect", "width": 1920, "height": 1080, "interlace": false, "frame rate": 24 }}name is "Jack ("Bee") Nimble"{ "type": "rect", "width": 1920, "height": 1080, "interlace": false, "frame rate": 24}type is "rect"width is 1920interlace is 0["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]day is "Sunday"day is "Monday"day is "Tuesday"day is "Wednesday"day is "Thursday"day is "Friday"day is "Saturday"[[0, -1, 0], [1, 0, 0], [0, 0, 1]]day is 0day is -1day is 0day is 1day is 0day is 0day is 0day is 0day is 1{ "Image": { "Width": 800, "Height": 600, "Title": "View from 15th Floor", "Thumbnail": { "Url": "http:/*www.example.com/image/481989943", "Height": 125, "Width": "100" }, "IDs": [116, 943, 234, 38793] }}[{ "precision": "zip", "Latitude": 37.7668, "Longitude": -122.3959, "Address": "", "City": "SAN FRANCISCO", "State": "CA", "Zip": "94107", "Country": "US" }, { "precision": "zip", "Latitude": 37.371991, "Longitude": -122.026, "Address": "", "City": "SUNNYVALE", "State": "CA", "Zip": "94085", "Country": "US" }]{ "number": null}
欢迎关注公众号:嵌入式学习与实践