赞
踩
一、cJSON的介绍
cJSON是一个开源的JSON解析器,用于解析JSON数据。它是由纯C语言实现,因此跨平台性好,移植简单。
下载地址:
- https://github.com/DaveGamble/cJSON.git
- https://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 1920
- interlace 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 0
- day is -1
- day is 0
- day is 1
- day is 0
- day is 0
- day is 0
- day is 0
- day 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
- }
欢迎关注公众号:嵌入式学习与实践
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。