0


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

一、cJSON的介绍

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

下载地址:

https://github.com/DaveGamble/cJSON.git
https://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 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
}

438caaf00878679c2b083aa019fd8120.png

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

标签: c语言 json 开源

本文转载自: https://blog.csdn.net/weixin_46158019/article/details/134046883
版权归原作者 嵌入式学习和实践 所有, 如有侵权,请联系我们删除。

“c语言-json开源库cJSON的使用”的评论:

还没有评论