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

这篇具有很好参考价值的文章主要介绍了c语言-json开源库cJSON的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、cJSON的介绍

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

下载地址:

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

cjson使用,c语言,json,开源,mfc,开发语言

cjson使用,c语言,json,开源,mfc,开发语言

cjson使用,c语言,json,开源,mfc,开发语言

二、移植方法

    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
}

cjson使用,c语言,json,开源,mfc,开发语言

欢迎关注公众号:嵌入式学习与实践文章来源地址https://www.toymoban.com/news/detail-861727.html

到了这里,关于c语言-json开源库cJSON的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【嵌入式项目应用】__cJSON在单片机的使用

    目录 前言 一、JSON和cJson 二、cJSON是如何表示JSON数据的 三、如何封装完整的JSON数据 1. 先将串口打通,方便电脑查看log日志。 2. 增加cjson.c文件,已经在main.c中 3. 准备打包如下的JSON包 4. 代码部分,先将几个部分初始化指针 5. 创建链表 6. 我们查看添加的是否正确,可以将链表

    2024年02月08日
    浏览(35)
  • ESP8266获取天气预报信息,并使用CJSON解析天气预报数据

    当前文章介绍如何使用ESP8266和STM32微控制器,搭配OLED显示屏,制作一个能够实时显示天气预报的智能设备。将使用心知天气API来获取天气数据,并使用MQTT协议将数据传递给STM32控制器,最终在OLED显示屏上显示。 心知天气是一家专业的气象数据服务提供商,致力于为全球用户

    2024年02月10日
    浏览(51)
  • cJSON代码解读

    cJSON用了很久,但是对它一直不太了解。这次向添加对long long类型的支持,一直出问题。因为有以前添加两位小数float的经历,我觉得会很轻松,没想到翻车了。于是有了这边文档,阅读了部分博主对cJSON的解析,给出自己的体悟。 1.1 参考文档 【万字详解】cJSON解析-CSDN博客

    2024年02月03日
    浏览(28)
  • 【RPC 协议】序列化与反序列化 | lua-cjson | lua-protobuf

    在分布式计算,远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关

    2024年02月10日
    浏览(37)
  • Dify开源大语言模型(LLM) 应用开发平台如何使用Docker部署与远程访问

    本文主要介绍如何在Linux Ubuntu系统以Docker的方式快速部署Dify,并结合cpolar内网穿透工具实现公网远程访问本地Dify! Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你

    2024年04月10日
    浏览(45)
  • 【go语言开发】本地缓存的使用,从简单到复杂写一个本地缓存,并对比常用的开源库

    本文主要介绍go语言中本地缓存的使用,首先由简单到复杂手写3个本地缓存示例,使用内置的sync,map等数据结构封装cache,然后介绍常见的一些开源库,以及对比常用的开源库 本地缓存 是指将一部分数据存储在应用程序本地内存中,以提高数据访问速度和应用程序性能的技

    2024年02月04日
    浏览(33)
  • 开源库nlohmann json使用备忘

    nlohmann/json是一个用于解析JSON的开源C++库,口碑一流,无需额外安装其他第三方库,还支持单个头文件模式,使用起来非常方便直观。 从官网https://github.com/nlohmann/json的Release页面下载单个 json.hpp 即可直接使用,无需单独编译。 下面以示例的方式罗列nlohmann/json库的基本使用方

    2024年02月16日
    浏览(32)
  • MFC——base编码和json数据

    目录 1.  JSON是什么 2. base64是什么 Base64是一种编解码算法         JSON 是一种数据格式。采用完全独立于语言的文本格式, 因为易读, 易写, 易解析的特性成为理想的数据交换语言。主要有三种类型的值:简单值(字符串, 数字, 布尔, null), 对象, 数组。 长这样的数据: JSON 语法

    2024年02月11日
    浏览(37)
  • [C++ Json开源库] nlohmann安装与使用

    nlohmann json GitHub - nlohmann/json: JSON for Modern C++ 是一个为现代C++(C++11)设计的JSON解析库,主要特点是: 1、易于集成,仅需一个头文件,无需安装依赖 2、易于使用,可以和STL无缝对接,使用体验近似python中的json Linux下: 拉取nlohmann库文件 自己建立一个项目工程文件夹, 将i

    2024年04月11日
    浏览(34)
  • MFC发送http https以及json解析

    请求三部曲:

    2024年02月05日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包