JSON数据格式讲解与cJSON库的使用

文章目录

  • 写在前面
  • 一、安装cJSON
  • 二、使用cJSON
    • 1、使用的文件
    • 2、如何传输数据:****
  • 三、JSON语法
  • 四、cJSON函数讲解
    • 1、cJSON结构体 **
    • 2、cJSON结构体与字符串之间的转换(重要)
      • 2.1、标题将cJSON结构体转换为字符串(常用)
      • 2.2、将字符串转为cJSON结构体(常用)
    • 3、cJSON创建键值对
      • 3.1、先调用 cJSON_CreateXXX 创建对象或数组,然后调用 cJSON_AddItemToObject 将值加入到对象或数组中
      • 3.2、直接调用 cJSON_AddXXXToObject 创建并添加值到对象中
    • 4、解析
    • 5、释放cJSON数据
  • 五、示例
    • 1、创建
    • 2、解析(主要参考与使用)
      • 2.1、解析 {}
      • 2.2、解析[ {} {} ]
    • 3、解析(参考形式)
      • 3.1、解析 {}
      • 3.2、解析 [ ]
      • 3.3、解析 [ {} {} ]
      • 3.4、解析[ [ ] [ ] ]
      • 3.5、解析 { { } { } }
    • 参考文章

写在前面

什么是JSON:一种轻量级的数据交换格式
JSON用途:解析收到的数据和发送对方能够解析的数据
什么是cJSON:c语言格式下使用JSON的工具

一、安装cJSON

cjson官方库,直接点击下载zip,解压缩

git clone https://github.com/DaveGamble/cJSON.git
cd cJSON/
mkdir build
cd build/
cmake ..
make
make install

二、使用cJSON

1、使用的文件

然后我们,可以看到很多文件,但是,我们不需要这么多,使用cjson只需要两个文件,
拷贝cJSON.c和cJSON.h文件到自己的项目中就可以了,linux,windows上都可以使用

CJOSN.h
CJSON.c

2、如何传输数据:****

1、创建cJSON格式数据,转换成为cJSON字符串,然后传输。
2、将cJSON字符串解析成cJSON格式数据,然后提取出相应的数据内容。

三、JSON语法

JSON对象是一个无序的"key(关键字)/value(值)"键值对的集合:
"{“开始,以”}“结束 ,允许嵌套使用
每个key(关键字)和value(值)成对出现,关键字和值之间使用”:“分隔
键/值之间用”,"分隔
在这些字符前后允许存在无意义的空白符

其中**关键字**只能是字符串(使用双引号“”表示)****可以有如下表示:数字(整数或浮点数)字符串(在双引号中)逻辑值(true 或 false)数组 (在中括号中)对象 (在大括号中)null

四、cJSON函数讲解

1、cJSON结构体 **

/* The cJSON structure: */
typedef struct cJSON
{
//这些不用管struct cJSON *next;struct cJSON *prev;struct cJSON *child;//这些都要知道//该json对象的类型,可以是字符串,int,double....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,那么值存在这里int valueint;/* The item's number, if type==cJSON_Number *///如果类型是double,那么值存在这里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;

2、cJSON结构体与字符串之间的转换(重要)

2.1、标题将cJSON结构体转换为字符串(常用)

使用这个两个函数一定一定一定要 调用cJSON_Delete函数 释放它们返回的指针内存

//将CJSON数据转换为字符串(保留原来的格式:例如会保留空格和回车)
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
//将CJSON数据转换为字符串(删除所有格式,只保留文本)
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);

2.2、将字符串转为cJSON结构体(常用)

//将json字符串转换为结构体,并且将其赋给一个指针
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);

3、cJSON创建键值对

3.1、先调用 cJSON_CreateXXX 创建对象或数组,然后调用 cJSON_AddItemToObject 将值加入到对象或数组中

CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);	//创建对象---常用
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);	//创建数组---常用
CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);//创建整型数组
CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);//创建双浮点型数组CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);	//在对象中添加项目
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);//在数组中添加项目

3.2、直接调用 cJSON_AddXXXToObject 创建并添加值到对象中

CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);
CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);

4、解析

注意:解析—是从cJSON结构体类型中—解析

//获取数组大小
CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);
//获取数组里面的某一个值
CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
//这个函数将某一个键值对,提取出来放到一个结构体中
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string)

5、释放cJSON数据

void  cJSON_Delete(cJSON *c);
/*作用:释放位于堆中cJSON结构体内存

五、示例

1、创建

#include <stdio.h>
#include "cJSON.h"int main(void)
{double  grade[4]={66.51,118.52,61.53,128.54};int		time[4]={123,456,789,150};cJSON *TCP = cJSON_CreateObject();				//创建一个对象cJSON_AddStringToObject(TCP,"name","MQ");		//添加字符串 cJSON_AddNumberToObject(TCP,"age",25);	    	//添加整型数字 cJSON_AddNumberToObject(TCP,"height",183.52);	//添加浮点型数字cJSON_AddFalseToObject(TCP,"gender");			//添加逻辑值falsecJSON *ADD	= cJSON_CreateObject();				//创建一个对象cJSON_AddStringToObject(ADD,"country","China");	//添加字符串 cJSON_AddNumberToObject(ADD,"zip-code",123456);	//添加整型数字cJSON_AddItemToObject(TCP,"address",ADD);cJSON *SUB  = cJSON_CreateArray();				//创建一个数组cJSON_AddStringToObject(SUB,"","政治"); 		//添加字符串到数组cJSON_AddStringToObject(SUB,"","数学");cJSON_AddStringToObject(SUB,"","英语");cJSON_AddStringToObject(SUB,"","专业课");cJSON_AddItemToObject(TCP,"subject",SUB);		//添加数组到对象cJSON *TIM  = cJSON_CreateIntArray(time,4);		//创建一个整型数组cJSON_AddItemToObject(TCP,"time",TIM);cJSON *GRA  = cJSON_CreateDoubleArray(grade,4);	//创建一个双浮点型数组cJSON_AddItemToObject(TCP,"grade",GRA);cJSON *STU  = cJSON_CreateArray();			//创建一个数组cJSON *Z3  = cJSON_CreateObject();			//创建一个对象cJSON_AddStringToObject(Z3,"name","张三");	//添加字符串 cJSON_AddNumberToObject(Z3,"age",24);	    //添加整型数字 cJSON_AddTrueToObject(Z3,"gender");			//添加逻辑值 cJSON_AddItemToArray(STU,Z3);				//添加对象到数组中 cJSON *L4  = cJSON_CreateObject();			//创建一个对象cJSON_AddStringToObject(L4,"name","李四");	//添加字符串 cJSON_AddNumberToObject(L4,"age",25);	    //添加整型数字 cJSON_AddTrueToObject(L4,"gender");			//添加逻辑值 cJSON_AddItemToArray(STU,L4);				//添加对象到数组中cJSON *W5  = cJSON_CreateObject();			//创建一个对象cJSON_AddStringToObject(W5,"name","王五");	//添加字符串 cJSON_AddNumberToObject(W5,"age",26);	    //添加整型数字 cJSON_AddTrueToObject(W5,"gender");			//添加逻辑值 cJSON_AddItemToArray(STU,W5);				//添加对象到数组中cJSON_AddItemToObject(TCP,"student",STU);	//添加数组到对象中char *json_data = cJSON_Print(TCP);	//JSON数据结构转换为JSON字符串printf("%s\n",json_data);//输出字符串cJSON_Delete(TCP);//清除结构体return 0;
}

现象

{"name":	"MQ","age":	25,"height":	183.52,"gender":	false,"address":	{"country":	"China","zip-code":	123456},"subject":	["政治", "数学", "英语", "专业课"],"time":	[123, 456, 789, 150],"grade":	[66.51, 118.52, 61.53, 128.54],"student":	[{"name":	"张三","age":	24,"gender":	true}, {"name":	"李四","age":	25,"gender":	true}, {"name":	"王五","age":	26,"gender":	true}]
}

2、解析(主要参考与使用)

2.1、解析 {}

int parsecjson_data(char *jsonstring)
{	cJSON *cjson= cJSON_Parse(jsonstring);if(cjson) {//解析 JSON 数据并处理cJSON *state = cJSON_GetObjectItem(cjson, "state");if (state != NULL && cJSON_IsString(state)) {printf("State: %s\n", state->valuestring);		//字符串}cJSON *brightness = cJSON_GetObjectItem(cjson, "brightness");if (brightness != NULL && cJSON_IsNumber(brightness)) {printf("Brightness: %d\n", brightness->valueint);		//整形}cJSON *height = cJSON_GetObjectItem(object2, "height");  if (height != NULL && cJSON_IsNumber(height)) {printf("height: %d \n", height->valuedouble);			//浮点型}cJSON *gender = cJSON_GetObjectItem(object2, "gender");  if (gender != NULL && cJSON_IsBool(gender)) {printf("gender: %d \n", gender->type);			//布尔类型	true/false}}cJSON_Delete(cjson);return 0;
}

2.2、解析[ {} {} ]

int parsecjson_data(char *jsonstring)
{	cJSON *cjson = cJSON_Parse(jsonstring);if (cjson != NULL && cJSON_IsArray(cjson)) {int array_size = cJSON_GetArraySize(cjson);if (array_size >= 2) {cJSON *object1 = cJSON_GetArrayItem(cjson, 0);  // 获取数组中的第一个对象cJSON *object2 = cJSON_GetArrayItem(cjson, 1);  // 获取数组中的第二个对象if (object1 != NULL && cJSON_IsObject(object1)) {		// 第一个对象中的字段cJSON *sens1 = cJSON_GetObjectItem(object2, "K3");  // 第一个对象中有名为 K3 的字段if (sens1 != NULL && cJSON_IsNumber(sens1)) {car.sens1 = sens1->valueint;printf("sens1: %d \n", sens1->valueint);}} if (object2 != NULL && cJSON_IsObject(object2)) {cJSON *sens2 = cJSON_GetObjectItem(object2, "K4");  // 第二个对象中有名为 K4 的字段if (sens2 != NULL && cJSON_IsNumber(sens2)) {car.sens2 = sens2->valueint;printf("sens2: %d\n", sens2->valueint);}}}}cJSON_Delete(cjson);return 0;
}

3、解析(参考形式)

注释:借鉴参考文章

3.1、解析 {}

1

{/*************** 方式一 ***************/item = cJSON_GetObjectItem(root, "interest");		// 获取object对象名if (item != NULL) {cJSON *val = NULL;val = cJSON_GetObjectItem(item, "basketball");	// 根据object对象名获得里面的basketball数据if (val != NULL && val->type == cJSON_String) {v_str = val->valuestring;printf("basketball = %s\n", v_str);}val = cJSON_GetObjectItem(item, "badminton");	// 根据object对象名获得里面的badminton数据if (val != NULL && val->type == cJSON_String) {v_str = val->valuestring;printf("badminton = %s\n", v_str);}}/*************** 方式二 ***************/item = cJSON_GetObjectItem(root, "interest");if (item != NULL) {cJSON *obj = item->child;	// 获得 "basketball":	"篮球"while (obj) {if (obj->type == cJSON_String) {char *v_str = obj->valuestring;printf("%s = %s\n", obj->string, v_str);	// 可以通过string获得键}// 获取下一个元素obj = obj->next;}}
}

3.2、解析 [ ]

2

{/*************** 方式一 ***************/item = cJSON_GetObjectItem(root, "color");if (item != NULL) {int size = cJSON_GetArraySize(item);	// 获得数组个数for (int i = 0; i < size; i++) {cJSON *arr = cJSON_GetArrayItem(item, i);	// 根据索引获得数组中的值if (arr != NULL && arr->type == cJSON_String) {v_str = arr->valuestring;printf("color = %s\n", v_str);}}}/*************** 方式二 ***************/item = cJSON_GetObjectItem(root, "color");if (item != NULL) {cJSON *arr = item->child;	// 获得 "black"while (arr) {if (arr->type == cJSON_String) {char *v_str = arr->valuestring;printf("color = %s\n", v_str);}// 获取下一个元素arr = arr->next;}}
}

3.3、解析 [ {} {} ]

3

{/*************** 方式一 ***************/item = cJSON_GetObjectItem(root, "like");if (item != NULL) {int size = cJSON_GetArraySize(item);	// 获取的数组大小for (int i = 0; i < size; i++) {cJSON *obj = cJSON_GetArrayItem(item, i);		// 获取的数组里的objcJSON *val = NULL;if (obj != NULL && obj->type == cJSON_Object) {	// 判断数字内的元素是不是obj类型val = cJSON_GetObjectItem(obj, "game");		// 获得obj里的值if (val != NULL && val->type == cJSON_String) {v_str = val->valuestring;printf("game = %s\n", v_str);}val = cJSON_GetObjectItem(obj, "price");if (val != NULL && val->type == cJSON_Number) {v_double = val->valuedouble;printf("price = %.2f\n", v_double);}}}}/*************** 方式二 ***************/item = cJSON_GetObjectItem(root, "like");if (item != NULL) {cJSON *obj = item->child;	// 获得 { "game": "马里奥", "price": 66.6 }while (obj) {if (obj->type == cJSON_Object) {cJSON *objValue = obj->child;	// 获得 "game": "马里奥"while (objValue) {// 再通过类型去区分if (objValue->type == cJSON_String) {char *v_str = objValue->valuestring;printf("%s = %s\n", objValue->string, v_str);} else if (objValue->type == cJSON_Number) {double v_double = objValue->valuedouble;printf("%s = %.2f\n", objValue->string, v_double);}// 获取下一个元素objValue = objValue->next;}}// 获取下一组元素obj = obj->next;}}
}

3.4、解析[ [ ] [ ] ]

4

{/*************** 方式一 ***************/item = cJSON_GetObjectItem(root, "education");if (item != NULL) {int size = cJSON_GetArraySize(item);	// 获取的数组大小for (int i = 0; i < size; i++) {cJSON *arr = cJSON_GetArrayItem(item, i);		// 解析获得	[ "小学", "初中" ]if (arr != NULL && arr->type == cJSON_Array) {int arrSize = cJSON_GetArraySize(arr);for (int j = 0; j < arrSize; j++) {cJSON *arr2 = cJSON_GetArrayItem(arr, j);	// 再进一步解析就可以得到数组里面的元素了if (arr2 != NULL && arr2->type == cJSON_String) {v_str = arr2->valuestring;printf("education = %s\n", v_str);}}}}}/*************** 方式二 ***************/item = cJSON_GetObjectItem(root, "education");if (item != NULL) {cJSON *arr = item->child;	// 获得 [ "小学", "初中" ]while (arr) {if (arr->type == cJSON_Array) {cJSON *arrValue = arr->child;	// 获得 "小学"while (arrValue) {if (arrValue->type == cJSON_String) {char *v_str = arrValue->valuestring;printf("education = %s\n", v_str);}arrValue = arrValue->next;	// 获取下一个元素}}// 获取下一组arr = arr->next;}}
}

3.5、解析 { { } { } }

5

{/*************** 方式一 ***************/char *arrStr[] = { "serialOne", "serialTwo" };		// 可以提前定义需要解析的对象键,这样就可以使用for循环进行解析了item = cJSON_GetObjectItem(root, "languages");if (item != NULL) {cJSON *val = NULL;int size = sizeof(arrStr) / sizeof(char *);// 通过遍历指针数组,获得每个对象的键,在进行解析操作(如果不使用for循环解析,那就老老实实的写代码将全部个数解析完毕)for (int i = 0; i < size; i++) {cJSON *obj1 = cJSON_GetObjectItem(item, arrStr[i]);if (obj1 != NULL && obj1->type == cJSON_Object) {val = cJSON_GetObjectItem(obj1, "language");if (val != NULL && val->type == cJSON_String) {v_str = val->valuestring;printf("education = %s\n", v_str);}val = cJSON_GetObjectItem(obj1, "grade");if (val != NULL && val->type == cJSON_Number) {v_int = val->valueint;printf("grade = %d\n", v_int);}}}}/*************** 方式二 ***************/// 在不知道键是什么的情况下 和 不知道有多少元素的情况下可用item = cJSON_GetObjectItem(root, "languages");if (item != NULL) {// 获取到languages里的第一个子元素cJSON *obj = item->child;	// 也就是:"serialOne": { "language": "汉语", "grade": 10 }while (obj) {if (obj->type == cJSON_Object) {// 获取到子元素的子元素cJSON *value = obj->child;	// 也就是:{ "language": "汉语", "grade": 10 }while (value) {if (value->type == cJSON_String) {printf("%s = %s\n", value->string, value->valuestring);} else if (value->type == cJSON_Number) {printf("%s = %d\n", value->string, value->valueint);}// 通过next可以自由获取里面的元素了value = value->next;}}// 获得下一组子元素obj = obj->next;}}
}

参考文章

cJSON库用法详解
Cjson入门快速使用
使用cjson库 操作Json格式文件(创建、插入、解析、修改、删除)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/311208.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅尝 express + ORM框架 prisma 的结合

一、prisma起步 安装&#xff1a; npm i prisma -g查看初始化帮助信息&#xff1a; prisma init -h查看初始化帮助信息结果&#xff1a; Set up a new Prisma projectUsage$ prisma init [options] Options-h, --help Display this help message --datasource-provider …

MQ概览及Kafka详解

文章目录 概览MQ优点MQ缺点常见MQ对比JMS消息模型点对点模式发布订阅模式 kafka基础架构发布订阅工作流程生产者生产者文件存储生产者分区策略生产者数据可靠性保证生产者数据一致性保证生产者ack机制ExactlyOnce生产者发送消息流程 消费者消费者分区分配策略消费者消费数据问题…

平价健身运动耳机哪个好?真实分享五款高性能产品

在挑选这些耳机时&#xff0c;我们应该综合考虑了音质、舒适度、耐用性、稳定性以及价格等多个因素&#xff0c;无论你是跑步爱好者、健身达人还是户外运动者&#xff0c;接下来就让我们一起探索高性能平价健身运动耳机有哪些吧&#xff0c;都是我真实使用分享的哦。 第一款&am…

Web3与社会契约:去中心化治理的新模式

在数字化时代&#xff0c;技术不断为我们提供新的可能性&#xff0c;而Web3技术作为一种基于区块链的创新&#xff0c;正在引领着互联网的下一波变革。它不仅改变了我们的经济模式和商业逻辑&#xff0c;还对社会契约和权力结构提出了全新的挑战和思考。本文将深入探讨Web3的基…

如何在CentOS安装Firefox并结合内网穿透工具实现公网访问本地火狐浏览器

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

折叠面板组件(vue)

代码 <template><div class"collapse-info"><div class"collapse-title"><div class"title-left">{{ title }}</div><div click"changeHide"> <Button size"small" v-if"sho…

node后端上传文件到本地指定文件夹

实现 第一步&#xff0c;引入依赖 const fs require(fs) const multer require(multer) 第二步&#xff0c;先设置一个上传守卫&#xff0c;用于初步拦截异常请求 /*** 上传守卫* param req* param res* param next*/ function uploadFile (req, res, next) {// dest 值…

如何在SFTP工具中使用固定公网地址远程访问内网Termux系统

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

MVVM、MVC、MVP的区别

MVC、MVP 和 MVVM 是三种常见的软件架构设计模式&#xff0c;主要通过分离关注点的方式来组织代码结构&#xff0c;优化开发效率。 在开发单页面应用时&#xff0c;往往一个路由页面对应了一个脚本文件&#xff0c;所有的页面逻辑都在一个脚本文件里。页面的渲染、数据的获取&a…

Day01-环境准备与镜像案例

Day01-环境准备与镜像案例 1. 容器架构1.1 Iaas Paas Saas (了解)1.2 什么是容器1.3 容器vs虚拟机1.4 Docker极速上手指南1&#xff09;配置docker源(用于安装docker)2&#xff09;docker下载镜像加速的配置3&#xff09;自动补全 1.5 Docker C/S架构1.6 Docker的镜像管理1&…

每日练习——leetcode402. 移掉 K 位数字和17. 电话号码的字母组合

目录 402. 移掉 K 位数字 题目描述 解题思路 代码实现 17. 电话号码的字母组合 题目描述 解题思路 代码实现 402. 移掉 K 位数字 题目描述 给你一个以字符串表示的非负整数 num 和一个整数 k &#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的数字最小。请…

为了保护版权,有大量图片需要加logo水印怎么办?快速批量加水印 一键可批量加水印几十张 几百张

一&#xff0c;加水印必要性 在数字化时代&#xff0c;图片作为信息传递的重要媒介&#xff0c;其保护和管理显得尤为重要。而给图片添加水印则是一种有效的方式&#xff0c;它不仅能够防止图片被未经授权地复制和盗用&#xff0c;还能够标明图片的来源和版权信息&#xff0c;…

【Spring】依赖注入(DI)时常用的注解@Autowired和@Value

目录 1、Autowired 自动装配 1.1、要实现自动装配不是一定要使用Autowired 1.2、Autowired的特性 &#xff08;1&#xff09;首先会根据类型去spring容器中找(bytype),如果有多个类型&#xff0c;会根据名字再去spring容器中找(byname) &#xff08;2&#xff09;如果根据名…

springcloud-fegin 组件调用

一、Feign 概述 Feign是Netflix开发的声明式、模板化的HTTP客户端&#xff0c; Feign可以帮助我们更快捷、优雅地调用HTTP API。 在Spring Cloud中&#xff0c;使用Feign非常简单——创建一个接口&#xff0c;并在接口上添加一些注解&#xff0c;代码就完成了。Feign支持多种…

llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署

文章目录 简介支持的模型列表2. 添加自定义数据集3. lora 微调4. 大模型 lora 权重&#xff0c;部署问题 参考资料 简介 文章列表&#xff1a; llama-factory SFT系列教程 (一)&#xff0c;大模型 API 部署与使用llama-factory SFT系列教程 (二)&#xff0c;大模型在自定义数…

Day01——NestJS学习之了解、安装、运行

什么是 Nest.js&#xff1f; NestJs 官方简介: Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力&#xff0c;使用并完全支持 TypeScript &#xff08;仍然允许开发者使用纯 JavaScript 进行开发&#x…

leetcode:739.每日温度/496.下一个更大元素

单调栈的应用&#xff1a; 求解当前元素右边比该元素大的第一个元素&#xff08;左右、大小都可以&#xff09;。 单调栈的构成&#xff1a; 单调栈里存储数组的下标&#xff1b; 单调栈里的元素递增&#xff0c;求解当前元素右边比该元素大的第一个元素&#xff1b;元素递…

【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 成员变量&#xff08;实例变量&#xff09;类变量&#xff08;静态变量&#xff09;定义方式静态变量的使用场景 成员变量&#xff08;实例变量&#xff09; 成员变量声明在一个类中&#xff0c;但在方法、构造…

【opencv】示例-videocapture_openni.cpp 深度数据获取和处理的示例

该代码是一个与使用OpenCV进行深度传感器捕获和处理相关的程序的一部分。主要功能包括处理Kinect或XtionPRO等深度传感器数据&#xff0c;解析命令行参数&#xff0c;打开视频捕获设备&#xff0c;以及在GUI上显示深度图&#xff0c;彩色图像&#xff0c;和红外图像等。代码中使…

linux 自定义快捷指令(docker

vi /root/.bashrc alias disdocker images alias dpsdocker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" 保存退出后使用sourece /root/.bashrc 让其立即生效 sourece /root/.bashrc