C语言使用cJson库解析json

cJSON(C语言JSON)库(适用于嵌入式序列化和反序列化) cJSON(C语言JSON)库是一个用于在C语言中解析和生成JSON数据的轻量级开源库。它提供了简单而强大的API,使C语言程序能够轻松地处理JSON数据。轻量级:cJSON库非常小巧,因此它不会增加太多的内存开销或二进制文件大小,适用于嵌入式系统和资源受限的环境。易于使用:cJSON提供了一组简单的API函数,使用户能够轻松地解析和生成JSON数据。这些API包括创建JSON对象、数组、字符串、数字等,以及将JSON数据解析成C语言数据结构。跨平台。 阅读详情

cjson库

在github或gitee上cjson,使用库中的cJSON.c与cJSON.h即可。
以下是我使用cjson的案例仅供参考。
点击下载 我的cJosn使用案例

cjson对象类型与结构体

/* cJSON Types: */
#define cJSON_Invalid (0)
#define cJSON_False  (1 << 0)
#define cJSON_True   (1 << 1)
#define cJSON_NULL   (1 << 2)
#define cJSON_Number (1 << 3)
#define cJSON_String (1 << 4)
#define cJSON_Array  (1 << 5)
#define cJSON_Object (1 << 6)
#define cJSON_Raw    (1 << 7) /* raw json */
/* The cJSON structure: */
typedef struct cJSON
{
   /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
   struct cJSON *next;
   struct cJSON *prev;
   /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
   struct cJSON *child; // 孩子节点,当为数组或对象类型才有值,基础类型为NULL

   /* The type of the item, as above. */
   int type;

   /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
   char *valuestring;
   /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
   int valueint;
   /* The item's number, if type==cJSON_Number */
   double valuedouble;

   /* The item's name string, if this item is the child of, 
   or is in the list of subitems of an object. */
   char *string; //键值对名字,根据名字,对象类型,获取值
} cJSON;

cjson的几个常用接口

json字符串的解析,使用完,记得释放空间

// 传入json字符串,将字符串转换为cJSON对象,这时在堆中申请了空间,
// cJSON对象用完,需要使用cJSON_Delete(cJSON *c)函数释放空间.
cJSON * cJSON_Parse(const char *value);

cjson对象空间的释放

// 释放通过cJSON_Parse,cJSON_CreateObject等create函数申请的空间
void cJSON_Delete(cJSON *c);

判断cjson对象的类型,有以下几种类型

/* These functions check the type of an item  用于判断cJSON对象类型*/
CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);

创建cjson对象,使用记得释放空间

/* 创建cjson对象These calls create a cJSON item of the appropriate type. */
CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);
CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
/* raw json */
CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);

将创建或修改的cjson对象输出为字符串,然后自己保存到文件,用完字符串需要释放空间

/* Render a cJSON entity to text for transfer/storage. */
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);

申请与释放空间,cJSON_Print返回的字符串空间,可用cJSON_free释放。

CJSON_PUBLIC(void *) cJSON_malloc(size_t size);
CJSON_PUBLIC(void) cJSON_free(void *object);

对cjson库进一步封装

对cjson库封装了几个函数,方便对json进行操作,以供参考

  1. 根据json文件路径,将文件转为json对象,失败返回NULL

    cJSON * json_parse(const char *path);
    
  2. 在父对象中,根据键值对中的名字,获取对应的子对象,失败返回NULL

    //pjson为父cjson对象, pitemname为子项名,返回子对象
    const cJSON * json_get_object(const cJSON *pjson, const char *pitemname);
    
  3. 在父对象中,根据键值对中的名字,获取对应的字符串

    //pjson为父cjson对象, pitemname为子项名,pdft为默认值,返回键值对中的值,找不到返回默认值
    const char * json_get_string(const cJSON *pjson,  const char *pitemname, const char *pdft);
    
  4. 在父对象中,根据键值对中的名字,获取对应的数值

    //pjson为父cjson对象, pitemname为子项名,pdft为默认值,返回键值对中的值,找不到返回默认值
    int json_get_number(const cJSON *pjson,  const char *pitemname, int pdft);
    
  5. 在父对象中,获取类型为数组的子对象,数组成员个数

    int json_get_array_size(const cJSON *pjson, const char *pitemname)
    

创建common.c的代码文件,并创建common.h的头文件,
common.c具体封装代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"

#define in_range(c, lo, up)  ((unsigned char)c >= lo && (unsigned char)c <= up)
#define isdigit(c)           in_range(c, '0', '9')

/**
 ******************************************************************************
 * @brief   字符串转换为正整数
 * @param[in] : *pstr : 字符串
 * @retval  >= 0 : 数值
 * @retval  <  0 : 转换失败
 ******************************************************************************
 */
int
str2i(const char *pstr)
{
    int ret = 0;
    if (!(*pstr && isdigit(*pstr)))
        return -1;
    do
    {
        ret = ret * 10 + (*pstr - '0');
        pstr++;
    } while (*pstr && isdigit(*pstr));
    return ret;
}

/**
 ******************************************************************************
 * @brief   将json文件解析为json 对象
 * @param[in]  *path : 文件路径
 * @retval  cJSON *  : 为NULL表示解析失败
 ******************************************************************************
 */
cJSON *
json_parse(const char *path)
{
    int file_size = 0;
    FILE  *fp = NULL;
    char *pstr = NULL;
    cJSON *pjson = NULL;
    int ret = 0;

    /*
     * 1. 获取文件长度
     * 2. 申请内存, 读取文件
     * 3. 调用cjson库解析结构
     * 4. 释放内存
     */
    do
    {
        if (!path)
        {
            break;
        }
        fp = fopen(path, "rb");
        if (NULL == fp)
        {
            break;
        }

		fseek(fp, 0, SEEK_END);
        file_size = ftell(fp);
        fseek(fp, 0, SEEK_SET);
        pstr = malloc(file_size + 1);
        if (!pstr)
        {
            break;
        }
        pstr[file_size] = 0; //last = 1
        if (file_size != (int)fread(pstr, 1, file_size, fp))
        {
            break;
        }
		cJSON_Print(pjson);
        pjson = cJSON_Parse(pstr);
        ret = pjson ? 1 : 0;
    } while (0);

    if (fp)
    {
        fclose(fp);
    }
    if (pstr)
    {
        free(pstr);
    }
    return ret ? pjson : NULL;
}

/**
 ******************************************************************************
 * @brief   获取json数组成员对象
 * @param[in]  *pjson : json对象
 * @param[in]  *pitemname : 成员
 * @retval   数值
 ******************************************************************************
 */
const cJSON *
json_get_object(const cJSON *pjson,
        const char *pitemname)
{
    /*
     * 1. 父子使用点(.)连接
     * 2. 需要解析array, 方括号[%d]
     */
    int pos;
    char item[64];
    char *ptmp;
    char *ptr = NULL;
    const char *pstr;
    const cJSON *parray;
    const cJSON *pobject = pjson;

    if (!pjson || !pitemname || !pitemname[0] || (strlen(pitemname) >= sizeof(item)))
    {
        return NULL;
    }

    strncpy(item, pitemname, sizeof(item));
    char* str = item;

    //使用"."分离
    while (pobject && (pstr = strtok_r(str, ".", &ptr)))
    {
        str = NULL;
        if ((ptmp = strstr(pstr, "["))) //Array
        {
            if (0 > (pos = str2i(ptmp + 1)))
            {
                break;
            }
            ptmp[0] = 0;
            parray = cJSON_GetObjectItem(pobject, pstr);
            if (!cJSON_IsArray(parray) || (pos >= cJSON_GetArraySize(parray)))
            {
                break;
            }
            pobject = cJSON_GetArrayItem(parray, pos);
        }
        else //object
        {
            pobject = cJSON_GetObjectItem(pobject, pstr);
        }
    }
    return pobject;
}

/**
 ******************************************************************************
 * @brief   获取json字符串
 * @param[in]  *pjson : json对象
 * @param[in]  *pitemname : 成员
 * @param[in]  *pdft  : 默认值
 * @retval   字符串(确保非空)
 ******************************************************************************
 */
const char *
json_get_string(const cJSON *pjson,
        const char *pitemname,
        const char *pdft)
{
    const char *pstr;
    const cJSON *pobject;
    do
    {
        if (!pjson || !pitemname || !pitemname[0])
        {
            break;
        }
        if (!(pobject = json_get_object(pjson, pitemname)))
        {
            break;
        }
        pstr = cJSON_GetStringValue(pobject);
        return pstr ? pstr : "";
    } while (0);
    return pdft ? pdft : "";
}

/**
 ******************************************************************************
 * @brief   获取json数值
 * @param[in]  *pjson : json对象
 * @param[in]  *pitemname : 成员
 * @param[in]  dft    : 默认值
 * @retval   数值
 ******************************************************************************
 */
int
json_get_number(const cJSON *pjson,
        const char *pitemname,
        int dft)
{
    const cJSON *pobject;
    do
    {
        if (!pjson || !pitemname || !pitemname[0])
        {
            break;
        }
        if (!(pobject = json_get_object(pjson, pitemname)))
        {
            break;
        }
        if (!cJSON_IsNumber(pobject))
        {
            break;
        }
        return pobject->valueint;
    } while (0);
    return dft;
}

/**
 ******************************************************************************
 * @brief   获取json数组成员数
 * @param[in]  *pjson : json对象
 * @param[in]  *pitemname : 成员
 * @retval   数值
 ******************************************************************************
 */
int
json_get_array_size(const cJSON *pjson,
        const char *pitemname)
{
    const cJSON *pobject;

    do
    {
        if (!pjson || !pitemname || !pitemname[0])
        {
            break;
        }
        if (!(pobject = json_get_object(pjson, pitemname)))
        {
            break;
        }
        if (!cJSON_IsArray(pobject))
        {
            break;
        }
        return cJSON_GetArraySize(pobject);
    } while (0);

    return 0;
}

common.h文件

#ifndef _COMMON_H
#define _COMMON_H

#include "./json/cJSON.h"

#if defined(__cplusplus)
extern "C"
{         
#endif

extern const cJSON *
json_get_object(const cJSON *pjson,
        const char *pitemname);

extern const char *
json_get_string(const cJSON *pjson,
        const char *pitemname,
        const char *pdft);

extern int
json_get_number(const cJSON *pjson,
        const char *pitemname,
        int dft);

extern int
json_get_array_size(const cJSON *pjson,
        const char *pitemname);

extern cJSON *
json_parse(const char *path);
#if defined(__cplusplus)
}
#endif
#endif

调用测试案例

创建config.json文件,文件内容如下

{
    "multicastIp": "239.0.0.10",
    "multicastPort": 8805,
    "services": [
        "192.168.0.118",
        "172.19.75.111",
        "172.19.75.45",
        "172.19.75.234"
    ]
}

创建mian.c的测试文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
#define CONFIG_FILE "./config.json"


typedef struct{
    int muticast_port;    //心跳端口号
    char * muticast_ip;   //组播IP
    int service_count;    // 服务器数量
    char**  service_ips;  // 服务器ip地址
} config_info_t;

config_info_t config;   //配置文件信息,只供读取

/**
 ******************************************************************************
 * @brief      初始化配置
 * @retval      0: 成功, -1: 失败
 ******************************************************************************
 */
int config_init()
{
    char key[64];
    cJSON * obj = NULL;

    // 检查配置文件并获取json对象
    if (NULL == (obj = json_parse(CONFIG_FILE)))
    {
		exit(1);
    }
    // 获取json中的数据
    config.muticast_port = json_get_number(obj, "multicastPort", 8805);
    config.muticast_ip = strdup(json_get_string(obj, "multicastIp", "239.0.0.10"));
    config.service_count = json_get_array_size(obj, "services");// 获取服务器个数

    // 根据服务器个数, 申请空间
    if (NULL == (config.service_ips = (char**) malloc(sizeof(char*) * config.service_count)))
    {
        cJSON_Delete(obj); //释放空间
        return -1;
    }
 
    // 获取所有服务器的地址
    memset(key, 0, sizeof(key));
    for (int i = 0; i < config.service_count; ++i)
    {
        snprintf(key, sizeof(key), "services[%d]", i);
        config.service_ips[i] = strdup(json_get_string(obj, key, NULL));
    }

    cJSON_Delete(obj); //释放json对象空间
    return 0;
}

/**
 ******************************************************************************
 * @brief       销毁配置对象, 释放空间
 * @param[in]  * pconfig : 配置文件对象
 ******************************************************************************
 */
void config_destroy()
{
    if (config.muticast_ip)
    {
        free(config.muticast_ip);
        config.muticast_ip = NULL;
    }

    if (config.service_ips)
    {
        for (int i = 0; i < config.service_count; ++i)
        {
            if (config.service_ips[i])
            {
                free(config.service_ips[i]);
                config.service_ips[i] = NULL;
            }
        }
        free(config.service_ips);
        config.service_ips = NULL;
    }
}

int main(int argc, char * argv[])
{
    config_init();

    printf("组播端口号:\t %d\n", config.muticast_port);
    printf("组播 IP:\t %s\n", config.muticast_ip);
    printf("服务端个数:\t %d\n", config.service_count);
    for (int i = 0; i < config.service_count; i++)
    {
        printf("服务器%d:\t %s\n", i, config.service_ips[i]);
    }
    
    config_destroy();
}

测试结果如下

lmz@lmz-X280:~/桌面/code/c/test/cJsonTest$ make all
gcc -fPIC -c -o common.o common.c 
gcc -fPIC -c -o cJSON.o ./json/cJSON.c
gcc main.c -o main common.o cJSON.o
lmz@lmz-X280:~/桌面/code/c/test/cJsonTest$ ./main 
组播端口号:      8805
组播 IP:         239.0.0.10
服务端个数:      4
服务器0:         192.168.0.118
服务器1:         172.19.75.111
服务器2:         172.19.75.45
服务器3:         172.19.75.234

补充

看到iperf中有个函数对cJSON进行了个封装,觉得挺好的,可以加入common.c中,方便对cJSON更好的操作。
需要#include <stdarg.h>,其功能是使用printf的形式创建cJSON对象。


/* Helper routine for building cJSON objects in a printf-like manner.
**
** Sample call:
**   j = json_printf("foo: %b  bar: %d  bletch: %f  eep: %s", b, i, f, s);
**
** The four formatting characters and the types they expect are:
**   %b  boolean           int
**   %d  integer           int64_t
**   %f  floating point    double
**   %s  string            char *
** If the values you're passing in are not these exact types, you must
** cast them, there is no automatic type coercion/widening here.
**
** The colons mark the end of field names, and blanks are ignored.
**
** This routine is not particularly robust, but it's not part of the API,
** it's just for internal iperf3 use.
*/
cJSON*
json_printf(const char *format, ...)
{
    cJSON* o;
    va_list argp;
    const char *cp;
    char name[100];
    char* np;
    cJSON* j;

    o = cJSON_CreateObject();
    if (o == NULL)
        return NULL;
    va_start(argp, format);
    np = name;
    for (cp = format; *cp != '\0'; ++cp) {
	switch (*cp) {
	    case ' ':
	    break;
	    case ':':
	    *np = '\0';
	    break;
	    case '%':
	    ++cp;
	    switch (*cp) {
		case 'b':
		j = cJSON_CreateBool(va_arg(argp, int));
		break;
		case 'd':
		j = cJSON_CreateNumber(va_arg(argp, int64_t));
		break;
		case 'f':
		j = cJSON_CreateNumber(va_arg(argp, double));
		break;
		case 's':
		j = cJSON_CreateString(va_arg(argp, char *));
        break;
		default:
		va_end(argp);
		return NULL;
	    }
	    if (j == NULL) {
	    	va_end(argp);
	    	return NULL;
	    }
	    cJSON_AddItemToObject(o, name, j);
	    np = name;
	    break;
	    default:
	    *np++ = *cp;
	    break;
	}
    }
    va_end(argp);
    return o;
}

cJSON* json_printf(const char *format, ...);使用示例


int main(int argc, char * argv[])
{
    char ip[] = "127.0.0.1";
    int port = 8080;

    cJSON * cjobj = cJSON_CreateObject();
    /*printf的形式创建对象*/
    cJSON * cjip = json_printf("ip: %s port: %d", ip, port);
    cJSON_AddItemToObject(cjobj, "service", cjip);
    
    char * p = cJSON_Print(cjobj);

    printf("%s \n", p);
    cJSON_free(p);
    cJSON_Delete(cjobj);
}
告别JSON解析焦虑:用C语言和cJSON库5分钟搞定天气预报数据解析 本文介绍了如何使用C语言和轻量级cJSON库快速解析天气预报API返回的复杂JSON数据。通过详细的代码示例,展示了cJSON库在嵌入式环境中的优势,包括单文件实现、低内存占用和简洁API设计,帮助开发者5分钟内完成JSON解析任务,提升开发效率。 阅读详情

相关推荐

C语言:cJSON库用法详解

一、JSON、cJSON简介 1. JSON 简介 JSON格式详解 2. cJSON简介 cJSON是一个使用C语言编写的JSON数据解析器,具有超轻便,可移植,单文件的特点,使用MIT开源协议。其中主要包括两个文件cjson.c和cjson.h。 cjson.h文件中包含了对于JSON格式的结构体定义以及一些操作JSON格式的功能函数,包括创建JSON、向JSON格式中添加数字,字符,布尔值等等、读取JSON格式、将JSON格式转化为字符串等。 cjson.c文件中就是功能函数的具体实现。 cJSO

MQ0522的博客 2万+

cJSON开源项目学习(一)

cJSON学习笔记

pan_1214_的博客 1160

C语言:使用cJSON库解析JSON字符串

一、解析简单的JSON字符串 二、解析嵌套数组的JSON字符串 三、解析嵌套对象的JSON格式

MQ0522的博客 8833

cJSON函数用法

cJson函数用法

BYTEDANCE的博客 1819

使用C语言和cJSON库解析JSON字符

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集,但JSON是独立于语言的文本格式。广泛用于Web应用程序中,作为不同系统间交换数据的一种方式。cJSONcJSON是一个用C语言编写的轻量级JSON库,它允许C语言程序以一个对象、数组和基本数据类型的方式来处理JSON数据。这个库通过简单的API提供了以下功能:解析JSON字符串成cJSON对象;将cJSON。

weixin_28721743的博客 1316

C语言实现JSON解析与序列化:tiny-cJSON库实战

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集,但其语法独立于语言,具有多种语言的实现。在现代Web开发中,JSON被广泛使用于前后端的数据交互。它能够清晰地表示结构化的数据,并且由于它的文本形式,使得存储和传输都非常方便。在JSON中,数据以键值对的形式存储,并且可以嵌套数组与对象以构建复杂的数据结构。

weixin_28939623的博客 1281

c语言json数据解析,C语言cJSON库的使用,解析json数据格式

摘自:https://www.cnblogs.com/piaoyang/p/9274925.html对于c语言来说是没有字典这样的结构的,所以对于解析json格式的数据来说不是那么好解析,但是有些时候又会需要处理这样的数据格式,这里就有一个解析json的函数库可以给我们使用了。这个函数库就是cJSON了。这里提供了下载资源可以下载后直接用。https://files.cnblogs.com/fil...

weixin_39636540的博客 630

【翼型】基于Matlab的NACA翼型气动性能仿真与优化【附源码】

本文详细介绍了如何使用Matlab进行NACA翼型的气动性能仿真与优化。内容涵盖从生成NACA翼型坐标、利用面板法快速估算升阻力,到进阶的粘性流模拟与优化设计入门。通过清晰的代码示例和分步指南,帮助读者掌握基于Matlab的翼型分析与优化流程,为飞行器或叶片设计提供实用工具和方法。

weixin_29032489的博客 411

c语言json结构体_C语言cJSON库的使用,解析json数据格式

主要函数接口介绍:这里有个很重要的结构体是需要用到的就是cJSON 结构体如下:typedef struct cJSON {struct cJSON *next,*prev; /* 遍历数组或对象链的前向或后向链表指针*/struct cJSON *child; /*数组或对象的孩子节点*/int type;...

weixin_39979167的博客 437

DEAP数据集实战指南:从脑电信号到情绪分类的完整流程解析

本文提供了DEAP数据集在脑电信号情绪识别领域的完整实战指南。详细解析了数据下载、结构理解、频带功率特征提取等核心步骤,并演示了如何构建和评估机器学习分类模型,为研究者实现从原始脑电信号到情绪分类的完整流程提供了清晰路径。

jj890的博客 903

FFmpeg流媒体开发避坑指南:avformat_open_input超时设置的那些坑

本文深入剖析了FFmpeg流媒体开发中avformat_open_input函数的超时设置难题。针对默认阻塞行为、无效的timeout参数以及不稳定的线程取消方案等常见误区,文章详细解读了官方推荐的interrupt_callback机制,并提供了健壮的超时控制器实现方案与最佳实践,帮助开发者构建稳定可靠的流媒体应用。

weixin_29239279的博客 238

cjson 对象是json数组型结构体_C语言cJSON库的使用,解析json数据格式

对于c语言来说是没有字典这样的结构的,所以对于解析json格式的数据来说不是那么好解析,但是有些时候又会需要处理这样的数据格式,这里就有一个解析json的函数库可以给我们使用了。这个函数库就是cJSON了。这里提供了下载资源可以下载后直接用。https://files.cnblogs.com/files/piaoyang/cJSONFiles.rar自己使用时可以只需要其中的cJSON.c和cJS...

weixin_39782573的博客 334

基于51单片机的多功能智能路灯控制系统(仿真+代码+原理图)

智能路灯控制系统主要由51单片机最小系统+1602显示模块+DS1302时钟模块+光强检测模块+按键输入模块+声光报警模块+LED照明模块+状态检测电路+人体车辆红外检测模块组成。能实现以下功能: 1.能够按键设定系统时间、工作时间、光照阈值 2.工作时间内路灯点亮,凌晨12点后路灯关闭,有人或车通过是,路灯点亮10s 3.非工作时间光照强度低于阈值,路灯点亮 4.能够检测系统工作状态,路灯应亮未亮,声光报警 5.具备手动控制,能够切换自动/手动控制功能

u012759563的博客 8179

C语言cJSON库的使用,解析json数据格式

C语言cJSON库的使用,解析json数据格式 摘自:https://www.cnblogs.com/piaoyang/p/9274925.html   对于c语言来说是没有字典这样的结构的,所以对于解析json格式的数据来说不是那么好解析,但是有些时候又会需要处理这样的数据格式,这里就有一个解析json的函数库可以给我们使用了。这个函数库就是cJSON了。这里提供了下载资源可以下载后直...

weixin_30883311的博客 406

Dify与第三方平台(飞书、微信、钉钉)LangBot机器人对接实战

调用链路:飞书用户发消息 → 飞书开放平台事件回调 → LangBot 服务 → Dify 应用接口 → Dify 知识库 + 大模型生成答案 → 原路返回飞书聊天框Dify:承载知识库、提示词配置、大模型调用能力;LangBot:多 IM 渠道适配器,统一对接各大 IM 开放平台与 Dify API;飞书开放平台:提供机器人消息收发、事件推送能力。LangBot 作为中间转发服务,一端对接 Dify 应用 API,一端对接飞书开放平台机器人接口;

悦分享 271

基于YOLOv8深度学习架构的智能农业巡检小车系统—面向农作物与杂草实时精准识别的创新实践

本研究设计并实现了一套基于YOLOv8的智能农业巡检小车系统,解决农田中农作物与杂草的精准识别与追踪问题。系统采用改进YOLOv8-RGCSPELAN-ECA-AFPN模型,融合ECA注意力机制与AFPN多尺度特征融合结构,提升复杂环境下的检测精度。硬件以树莓派4B为核心,集成摄像头、传感器与电机模块,具备避障、循迹与自主导航功能。移动端基于Android部署NCNN推理引擎,实现模型高效移植与实时检测。

Stara-AI的博客 1425

c语言json结构体_cJSON库(构建json与解析json字符串)-c语言

一、c语言获取json中的数据。1、先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h。2、感性认识char * json = "{ \"json\" : { \"id\":1,\"nodeId\":11,\"deviceId\":111,\"deviceName\":\"aaa\",\"ieee\":\"01212\",\"ep\":\"1111\",\"type\":\"bbb\...

weixin_33186395的博客 698

第4.4节:保护轴承与安全系统

飞轮储能系统的保护轴承是磁悬浮失效时的最后安全屏障,其设计需满足非干涉性、高可靠性和有限寿命承载原则。转子跌落过程包括自由下落、碰撞、进动和滑行减速等复杂非线性阶段,产生远超常规工况的冲击载荷。保护轴承需具备极限冲击容量、高温耐受性和抗卡死能力。系统采用多层级安全架构,结合故障诊断与健康管理,通过监测振动、电流等参数实现预测性维护。安全停机序列有序结合主动制动与被动摩擦制动,确保系统在极端工况下的安全。保护轴承类型多样,需根据系统规模与可靠性要求合理选择。

技术工作者 229

cjson构建_[置顶] cJSON库(构建json与解析json字符串)-c语言

一、c语言获取json中的数据。1、先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h。2、感性认识char * json = "{ \"json\" : { \"id\":1, \"nodeId\":11, \"deviceId\":111, \"deviceName\":\"aaa\", \"ieee\":\"01212\", \"ep\":\"1111\", \"type\":...

weixin_39988888的博客 296

如何对正射影像DOM(卫星影像、无人机航拍影像)进行拼接、合并以及去黑边(附 Global Mapper Pro 24.0 安装包(中文注册版))

为什么要对正射影像DOM进行拼接?影像去黑边、影像拼接的操作和步骤。

从地图看世界的专栏 4300

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

cJSON库(构建json与解析json字符串)-c语言

一、c语言获取json中的数据。 1、先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h。 2、感性认识 char * json = { \"json\" : { \"id\":1, \"nodeId\":11, \"deviceId\":111, \"deviceName\":

宁静致远 3151

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C语言调用cJSON库解析json

一、源代码文件下载 自己使用时可以只需要其中的cJSON.c和cJSON.h文件就可以了,只需要将cJSON和自己的main文件一起编译即可。 下载地址:https://download.youkuaiyun.com/download/Hearbeat/38500047 二、重要的接口函数: 1.cJSON *cJSON_Parse(const char *value); 解析JSON数据包,并按照cJSON结构体的结构序列化整个数据包。可以看做是获取一个句柄。 2.cJSON *cJSON_GetObjectIt

Leonban的博客 2452

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

[置顶] cJSON库(构建json与解析json字符串)-c语言

 一、c语言获取json中的数据。   1、先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h。 2、感性认识   char * json = "{ \"json\" : { \"id\":1, \"nodeId\":11, ...

weixin_33754065的博客 425
上一篇: /etc/profile中配置LD_LIBRARY_PATH不生效问题分析
下一篇: 使用snprintf实现itoa
elimuzi
博客等级 码龄10年 56粉丝 113原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值