c语言-json开源库cJSON的使用

开源 0

一、cJSON的介绍

    cJSON是一个开源的JSON解析器,用于解析JSON数据。它是由纯C语言实现,因此跨平台性好,移植简单。

下载地址:

https://github.com/DaveGamble/cJSON.githttps://gitee.com/du-yueqiang/cJSON?_from=gitee_search

76e3eb40657861c9bf0283952416c232.png

e9df5f9992940cf144d575783f08594d.png

40d145c2fd0d4b4c99f7aabf262f808b.png

二、移植方法

    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}

438caaf00878679c2b083aa019fd8120.png

欢迎关注公众号:嵌入式学习与实践

也许您对下面的内容还感兴趣: