JSON|cJSON 介绍以及具体项目编写
一、JSON介绍
JSON(JavaScript Object Notation 即JavaScript对象表示法)是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。
- JSON是一种数据交换格式.
- JSON独立于编程语言(你不必学习JavaScript).
- JSON表达数据的方式对通用的编程概念都很友好.
本文主要介绍使用C语言解析JSON文件
二、JSON语法规则
数据结构
- 对象(Object):使用花括号
{}
包裹,由键值对组成。键必须是字符串,使用双引号""
包裹,键值对之间用逗号,
分隔。 - 数组(Array):使用方括号
[]
包裹,值之间用逗号,
分隔。
值的类型
- 字符串(String):使用双引号
""
包裹的 Unicode 字符序列。 - 数值(Number):整数或浮点数,不使用引号,数字没有长度限制。
- 布尔值(Boolean):
true
或false
,表示"有"或者"没有",不使用引号。 - 空值(Null):
null
,表示没有这项内容,它不是0,0是一个数字,本质上是在计数,不使用引号。 - 嵌套对象或数组:可在值中嵌套对象或数组。数组:是由方括号括起来的一组值构成
注意事项
- 不允许使用单引号。
- 不允许包含注释。
- 不允许使用未定义的变量或特殊符号(如
NaN
、Infinity
)。 - 数组和对象可以包含不同类型的值。
- 使用冒号:来分割名称和值,名称始终在左侧,一定是字符串,值始终在右侧可以是多种类型
三、cJSON
3.1cJSON介绍和获取
首先在GitHub上下载开源的cjson.h以及cjson.c文件
这里给出附件
使用的时候,只需要将这两个文件复制到工程目录,然后包含头文件cJSON.h即可,如下:
#include "cJSON.h"
3.2cJSON数据结构和设计思想
核心数据结构:cJSON
结构体
cJSON 使用单一结构体表示所有 JSON 类型,通过 type
字段区分不同类型。
cJSON.h中源码如下
typedef struct cJSON {struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */int type; /* The type of the item, as above. */char *valuestring; /* The item's string, if type==cJSON_String */int valueint; /* The item's number, if type==cJSON_Number */double valuedouble; /* The item's number, if type==cJSON_Number */char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
} cJSON;
统一表示所有 JSON 类型:将其中的一条JSON数据抽象出来,也就是一个键值对,用上面的结构体 strcut cJSON 来表示
- 通过
type
字段(如JSON_Object
,JSON_Array
,JSON_Number
)区分不同类型。 - 数值类型通过
valueint
和valuedouble
存储,字符串类型通过valuestring
存储。
双向链表管理数组和对象成员:
- 数组(
JSON_Array
)和对象(JSON_Object
)使用双向链表next
和prev
连接成员。 - 对象的键值对通过
child
指针指向第一个成员,每个成员的string
字段存储键名
递归嵌套结构:
- 子节点可以是任意 JSON 类型,支持无限层级嵌套(如数组包含对象,对象包含数组)。
设计思想
1.轻量级与可移植性
- 无依赖:仅依赖标准 C 库(
stdlib.h
,string.h
,math.h
),无需额外依赖。 - 单文件实现:核心代码集中在
cJSON.c
和cJSON.h
,便于集成到嵌入式系统或资源受限环境。
2. 简单易用的 API
提供直观的函数接口,例如:
cJSON_Parse()
:解析 JSON 字符串为cJSON
对象。cJSON_GetObjectItem()
:通过键名获取对象成员。cJSON_Print()
:将cJSON
对象序列化为 JSON 字符串。cJSON_CreateObject()
/cJSON_CreateArray()
:创建 JSON 对象 / 数组。
3. 动态内存管理
- 使用
malloc()
和free()
动态分配和释放内存,需手动调用cJSON_Delete()
释放不再使用的对象。 - 支持自定义内存分配函数(通过
cJSON_Hooks
结构体),适配不同环境。
4. 错误处理
- 解析失败时返回
NULL
,通过cJSON_GetErrorPtr()
获取错误位置。 - 不提供详细错误信息(如行号、具体错误类型),适合快速解析简单 JSON。
3.3cJSON数据封装(含源码分析)
封装JSON数据的过程,其实就是创建链表和向链表中添加节点的过程。
1.创建头指针
cJSON* cjson_test = NULL;
2.创建头结点,并将头指针指向头结点
cjson_test = cJSON_CreateObject();
3.调用函数向链表中插入结点
cJSON_AddNullToObject(cJSON * const object, const char * const name);cJSON_AddTrueToObject(cJSON * const object, const char * const name);cJSON_AddFalseToObject(cJSON * const object, const char * const name);cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);cJSON_AddObjectToObject(cJSON * const object, const char * const name);cJSON_AddArrayToObject(cJSON * const object, const char * const name);
输出JSON数据
(char *) cJSON_Print(const cJSON *item);
一段完整的JSON数据就是一条长长的链表,cJSON提供了一个API,可以将整条链表中存放的JSON信息输出到一个字符串中,使用的时候,只需要接收该函数返回的指针地址即可。
3.4cJSON数据解析(含源码分析)
数据解析调用cJSON_Parse(const char *value)
解析JSON数据的过程,其实就是剥离一个一个链表节点(键值对)的过程
// 1.创建链表头指针:
cJSON* cjson_test = NULL;
//2.解析整段JSON数据,并将链表头结点地址返回,赋值给头指针:解析整段数据使用的API只有一个:
(cJSON *) cJSON_Parse(const char *value);
//3.根据键值对的名称从链表中取出对应的值,返回该键值对(链表节点)的地址
(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
//4.如果JSON数据的值是数组,使用下面的两个API提取数据:
(int) cJSON_GetArraySize(const cJSON *array);
(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
3.5cJSON内存管理
cJSON的所有操作都是基于链表的,cJSON在使用过程中大量的使用malloc从堆中分配动态内存的,所以在使用完之后,应当及时调用下面的函数,清空cJSON指针所指向的内存,该函数也可用于删除某一条数据:
void cJSON_Delete(cJSON *item);
3.6给出代码示例封装及解析
嵌套的数据封装时递归封装解析时也递归解析
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"// 封装(生成)JSON 数据
char* encapsulate_json_data() {// 创建根对象cJSON *root = cJSON_CreateObject();// 创建 user 对象cJSON *user = cJSON_CreateObject();cJSON_AddNumberToObject(user, "id", 12345);cJSON_AddStringToObject(user, "name", "Alice");// 创建 contact 对象cJSON *contact = cJSON_CreateObject();cJSON_AddStringToObject(contact, "email", "alice@example.com");// 创建 phone 数组cJSON *phone = cJSON_CreateArray();cJSON_AddItemToArray(phone, cJSON_CreateString("123-456-7890"));cJSON_AddItemToArray(phone, cJSON_CreateString("098-765-4321"));cJSON_AddItemToObject(contact, "phone", phone);// 将 contact 添加到 usercJSON_AddItemToObject(user, "contact", contact);// 将 user 添加到根对象cJSON_AddItemToObject(root, "user", user);// 添加布尔值cJSON_AddBoolToObject(root, "isActive", 1); // 1 表示 true// 添加嵌套数组cJSON *nested_array = cJSON_CreateArray();cJSON_AddItemToArray(nested_array, cJSON_CreateNumber(100));cJSON_AddItemToArray(nested_array, cJSON_CreateString("nested value"));cJSON *nested_obj = cJSON_CreateObject();cJSON_AddStringToObject(nested_obj, "key", "value");cJSON_AddItemToArray(nested_array, nested_obj);cJSON_AddItemToObject(root, "nested", nested_array);// 生成 JSON 字符串char *json_str = cJSON_Print(root);// 释放 JSON 对象cJSON_Delete(root);return json_str;
}// 解析 JSON 数据
void parse_json_data(const char *json_str) {// 解析 JSON 字符串cJSON *root = cJSON_Parse(json_str);if (root == NULL) {const char *error_ptr = cJSON_GetErrorPtr();if (error_ptr != NULL) {fprintf(stderr, "Error before: %s\n", error_ptr);}return;}// 提取基本字段cJSON *isActive = cJSON_GetObjectItem(root, "isActive");if (cJSON_IsBool(isActive)) {printf("isActive: %s\n", isActive->valueint ? "true" : "false");}// 提取 user 对象cJSON *user = cJSON_GetObjectItem(root, "user");if (cJSON_IsObject(user)) {cJSON *id = cJSON_GetObjectItem(user, "id");cJSON *name = cJSON_GetObjectItem(user, "name");if (cJSON_IsNumber(id) && cJSON_IsString(name)) {printf("User ID: %d\n", id->valueint);printf("User Name: %s\n", name->valuestring);}// 提取 contact 对象cJSON *contact = cJSON_GetObjectItem(user, "contact");if (cJSON_IsObject(contact)) {cJSON *email = cJSON_GetObjectItem(contact, "email");if (cJSON_IsString(email)) {printf("Email: %s\n", email->valuestring);}// 提取 phone 数组cJSON *phone = cJSON_GetObjectItem(contact, "phone");if (cJSON_IsArray(phone)) {int array_size = cJSON_GetArraySize(phone);printf("Phone Numbers (%d):\n", array_size);for (int i = 0; i < array_size; i++) {cJSON *phone_item = cJSON_GetArrayItem(phone, i);if (cJSON_IsString(phone_item)) {printf(" %d: %s\n", i+1, phone_item->valuestring);}}}}}// 解析嵌套数组cJSON *nested = cJSON_GetObjectItem(root, "nested");if (cJSON_IsArray(nested)) {printf("Nested Array:\n");int array_size = cJSON_GetArraySize(nested);for (int i = 0; i < array_size; i++) {cJSON *item = cJSON_GetArrayItem(nested, i);printf(" Item %d: ", i+1);if (cJSON_IsNumber(item)) {printf("Number = %f\n", item->valuedouble);} else if (cJSON_IsString(item)) {printf("String = %s\n", item->valuestring);} else if (cJSON_IsObject(item)) {printf("Object\n");cJSON *key = cJSON_GetObjectItem(item, "key");if (cJSON_IsString(key)) {printf(" key = %s\n", key->valuestring);}}}}// 释放 JSON 对象cJSON_Delete(root);
}int main() {// 封装 JSON 数据char *json_str = encapsulate_json_data();if (json_str == NULL) {fprintf(stderr, "Failed to generate JSON data.\n");return 1;}// 打印生成的 JSONprintf("Generated JSON:\n%s\n\n", json_str);// 解析 JSON 数据printf("Parsing JSON data...\n");parse_json_data(json_str);// 释放 JSON 字符串free(json_str);return 0;
}
四、cJSON项目
这个项目实现了一个使用 C 语言解析 JSON 文件的应用程序,主要内容是从包含中国行政区划信息的 JSON 文件中提取特定省份的城市列表。
具体实现思路:
因为cJSON.h中并没有定义对文件的操作,所以通过使用标准 C 库函数 fopen
、fread
和 fseek
读取 JSON 文件内容,把文件内容读取到字符串中,然后解析字符串,注意使用动态分配内存存储 JSON 数据,并在使用后正确释放,实际操作直接使用 cJSON 库解析 JSON 数据结构,包括对象、数组的遍历,最后通过使用 strcmp
进行字符串比较,即可定位目标省份。
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"char* read_file(const char* filename) {FILE* f = fopen(filename, "rb");if (!f) {perror("无法打开文件");return NULL;}fseek(f, 0, SEEK_END);long size = ftell(f);fseek(f, 0, SEEK_SET);char* buff = (char*)malloc(size + 1);if (buff == NULL) {perror("创建内存失败");fclose(f);return NULL;}size_t bytes_read = fread(buff, 1, size, f);//目标缓冲区 buff,每个数据项的大小(这里是 1 字节),要读取的数据项数量 size,以及文件流 f。if (bytes_read < size) {if (feof(f)) {//feof 函数用于检查文件流 f 是否已经到达文件末尾。printf("警告:文件已到达末尾,读取 %zu 字节(期望 %ld 字节)\n", bytes_read, size);}else if (ferror(f)) {perror("读取错误");free(buff);fclose(f);return NULL;}}buff[bytes_read] = '\0';fclose(f);return buff;
}int main() {char* json_str = read_file("city.json");if (json_str == NULL) {return -1;}cJSON* root = cJSON_Parse(json_str);if (root == NULL) {const char* error_ptr = cJSON_GetErrorPtr();if (error_ptr != NULL) {fprintf(stderr, "JSON解析错误: %s\n", error_ptr);}free(json_str);return -1;}// 检查 root 是否为数组if (root->type != cJSON_Array) {printf("JSON 根节点不是数组类型\n");cJSON_Delete(root);free(json_str);return -1;}const char* target_province = "陕西";int province_found = 0;// 遍历所有省份int province_count = cJSON_GetArraySize(root);for (int i = 0; i < province_count; i++) {cJSON* province_item = cJSON_GetArrayItem(root, i);if (!province_item) continue;// 获取省份名称cJSON* name = cJSON_GetObjectItem(province_item, "label");if (!name || name->type != cJSON_String) continue;// 检查是否为目标省份if (strcmp(name->valuestring, target_province) == 0) {printf("找到省份:%s\n", name->valuestring);province_found = 1;// 获取城市数组cJSON* cities_array = cJSON_GetObjectItem(province_item, "children");//注意数据嵌套关系,城市在省份的children数组里if (cities_array && cities_array->type == cJSON_Array) {int city_count = cJSON_GetArraySize(cities_array);printf("包含 %d 个城市:\n", city_count);for (int j = 0; j < city_count; j++) {cJSON* city_item = cJSON_GetArrayItem(cities_array, j);if (!city_item) continue;cJSON* city_name = cJSON_GetObjectItem(city_item, "label");if (city_name && city_name->type == cJSON_String) {printf(" %d. %s\n", j + 1, city_name->valuestring);}}}else {printf("未找到该省份的城市数据\n");}break; // 找到目标省份后退出循环}}if (!province_found) {printf("未找到省份:%s\n", target_province);}cJSON_Delete(root);free(json_str);return 0;
}
运行结果:
这里以查找陕西省的城市为例:
五、 JSON的应用场景有哪些?
多个应用场景:
-
Web API 数据传输
- RESTful API 的请求和响应格式
- 前后端数据交互(如 AJAX 请求)
-
配置文件
- 应用程序配置(如 Node.js 的 package.json)
- 开发工具配置(如 ESLint、Babel)
-
数据存储
- NoSQL 数据库(如 MongoDB)存储文档
- 临时数据缓存(如 Redis)
-
跨语言数据交换
- 微服务间通信(如通过消息队列)
- 不同系统间数据集成
-
移动应用开发
- 与服务器交换数据(如 JSON API)
- 本地存储(如 React Native 的 AsyncStorage)
-
日志和监控系统
- 结构化日志输出
- 监控指标传输
-
前端框架
- React/Vue 组件属性传递
- 路由配置
优势总结:
- 轻量级,易于阅读和编写
- 支持嵌套结构,适合复杂数据
- 几乎所有编程语言都有解析库
- 与 JavaScript 原生兼容
- 比 XML 更简洁,解析效率更高
尾语:项目学习并完成于2025.5.10,如果觉得有帮助有收获可以点赞收藏,会持续更新输出有用的内容,感兴趣可以关注我!
相关文章:
JSON|cJSON 介绍以及具体项目编写
一、JSON介绍 JSON(JavaScript Object Notation 即JavaScript对象表示法)是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。 JSON是一种数据交换格式.JSON独立于编程语言(你不必学习JavaScript).JSON表达数据的方式对通…...
Cell | 大规模 单细胞图谱 揭示非小细胞肺癌抗PD-1治疗后的免疫微环境异质性
–https://doi.org/10.1016/j.cell.2025.03.018 A single-cell atlas reveals immune heterogeneity in anti-PD-1-treated non-small cell lung cancer 留意更多内容:组学之心 研究简介 背景与问题 非小细胞肺癌(NSCLC)术后复发率高。新…...
光流 | 基于深度学习的光流估计算法汇总,原理,公式,流程图,代码
基于深度学习的光流算法 一、光流估计的基本原理二、基于深度学习的光流估计算法1. **FlowNet系列**2. **FlowNet 2.0**3. **PWC-Net**4. **RAFT(Recurrent All-Pairs Field Transformers)**5. **LiteFlowNet系列**三、算法流程图示例FlowNet2.0架构PWC-Net金字塔处理流程四、…...
常见的算法介绍
算法概述线性回归(Linear Regression)线性回归是一种通过属性的线性结合来进行预测的线性模型, 其目的是找到一条直线, 一个平面或者更高维的超平面, 使预测值和真实值之间的误差最小化逻辑回归(Logistic Regression)逻辑回归是一种分类模型, 入二分类公式 P ( Y 1 ∣ X ) e …...
【基于 LangChain 的异步天气查询1】异步调用 Open-Meteo API 查询该城市当前气温
目录 一、功能概述 二、文件结构 三、城市天气实时查询(运行代码) weather_runnable.py main.py 运行结果 四、技术亮点 五、使用场景 一、功能概述 它实现了以下主要功能: 用户输入地点(城市名) 构造提示词…...
深入解析JavaScript变量作用域:var、let、const全攻略
在JavaScript中,变量作用域是一个核心概念,它决定了变量的可访问性和生命周期。理解变量作用域对于编写清晰、高效且无错误的代码至关重要。本文将深入探讨JavaScript中不同类型的变量声明方式(var、let、const等),分析…...
C33-函数嵌套及编码实战
我们以一个编程题目的实践来学习此部分内容 题目:输入四个数,以函数的方式找出最大值 思维:使用两个数找出较大值→较大值与第三个数比较得出新的较大值→新的较大值与第四个数比较得出最大值 代码 #include <stdio.h>//内层函数的封装int GetMaxFromTwoNums(int a,int…...
clangd与clang-tidy
Clangd是基于Clang的Language Server,主要用于提供代码补全、跳转定义、错误提示等IDE功能。而Clang-Tidy则是静态代码分析工具,用于检查代码中的潜在问题,比如风格违规、潜在bug等。 clangd 核心工作原理 1. 基于编译器的精准解析 底层引擎…...
【Linux】冯诺依曼体系结构和操作系统的理解
目录 冯诺依曼体系结构一个例子来深入理解 初识操作系统操作系统的作用设计操作系统的目的操作系统之上和之下分别有啥 管理的精髓,先描述,再组织 冯诺依曼体系结构 我们知道,计算机这个东西发明出来就是帮助人们快速解决问题的。那如果我们想…...
Windows系统Jenkins企业级实战
目标 在Windows操作系统上使用Jenkins完成代码的自动拉取、编译、打包、发布工作。 实施 1.安装Java开发工具包(JDK) Jenkins是基于Java的应用程序,因此需要先安装JDK。可以从Oracle官网或OpenJDK下载适合的JDK版本。推荐java17版本&#x…...
服务预热原理
Java、Spring、Springboot工程启动后,第一次访问比较慢,而从第二次访问开始就快很多,这通常是由以下几个原因导致的: 类加载与初始化开销 类加载过程:Java程序在启动时需要加载大量的类文件到内存中,包括…...
Python核心编程深度解析:作用域、递归与匿名函数的工程实践
引言 Python作为现代编程语言的代表,其作用域管理、递归算法和匿名函数机制是构建高质量代码的核心要素。本文基于Python 3.11环境,结合工业级开发实践,深入探讨变量作用域的内在逻辑、递归算法的优化策略以及匿名函数的高效应用,…...
python环境搭建和pycharm的安装配置以及使用face_recognition与cv2
一.python环境的搭建: 1.下载python(这里以python3.11为例) step 1:打开下载网址:https://www.python.org/downloads/windows/ step 2:我这里选着python3.11.9的版本 2. 安装我就不说了,网上很多 二.pycharm的安装…...
养生:为健康生活筑牢根基
养生并非遥不可及的目标,而是贯穿于日常生活的点滴之中。从饮食、运动到心态调节,每一个环节都对我们的健康有着重要意义。以下为你详细介绍养生的实用策略,助力你开启健康生活模式。 饮食养生:科学搭配,滋养生命 合…...
linux-----------Ext系列⽂件系统(上)
1.理解硬盘 1-1 磁盘、服务器、机柜、机房 机械磁盘是计算机中唯⼀的⼀个机械设备 磁盘--- 外设 慢 容量⼤,价格便宜 1-2 磁盘物理结构 1-3 磁盘的存储结构 扇区:是磁盘存储数据的基本单位,512字节,块设备 如何定位⼀个扇区呢…...
ts装饰器
TypeScript 装饰器是一种特殊类型的声明,能够被附加到类声明、方法、访问符、属性或参数上。它本质上是一个函数,会在运行时被调用,并且被装饰的声明信息会作为参数传递给装饰器函数。 装饰器的分类 类装饰器 类装饰器作用于类构造函数&…...
未来通信中的大型人工智能模型:基础、应用与挑战的全面综述
题目:A Comprehensive Survey of Large AI Models for Future Communications: Foundations, Applications and Challenges 作者:江沸菠,潘存华,董莉,王可之,Merouane Debbah,Dusit Niyato&…...
青藏高原七大河流源区径流深、蒸散发数据集(TPRED)
时间分辨率 月空间分辨率 1km - 10km共享方式 开放获取数据大小 83.27 MB数据时间范围 1998-07-01 — 2017-12-31元数据更新时间 2024-07-22 数据集摘要 通过构建耦合积雪、冻土、冰川等冰冻圈水文物理过程的WEB-DHM模型(Water and Energy Budget-based Distribute…...
5.2 参数管理
目标 访问参数,用于调试、诊断和可视化;参数初始化;在不同模型组件间共享参数。 模型:单隐藏层的MLP import torch from torch import nnnet nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1)) X torch.rand(size…...
Best Video下载器——抖音视频去水印工具
在浏览抖音时,我们常常会遇到一些精彩的短视频,想要保存下来作为创作素材或与朋友分享。然而直接下载的视频往往带有平台水印,影响观看体验。今天就为大家介绍几种简单实用的去水印方法,让你轻松获取高清无水印视频。 目前市面上…...
C语言_程序的段
在 C 语言程序中,内存通常被分为多个逻辑段,每个段存储不同类型的数据。理解这些段的结构和功能,有助于你更高效地编写、调试和优化程序。以下是 C 语言程序中主要的内存段及其特点: 1. 代码段(Text Segment) 存储内容:编译后的机器指令(程序代码)。特性: 只读:防止…...
Google Earth Pro(谷歌地球)2025大陆版安装教程
软件介绍 【名称】:Google Earth Pro(谷歌地球)2025 【大小】:63.6M 【语言】:简体中文 【安装环境】:Win/Win8/Winxp/Win10/Win11 谷歌地球(Google Earth) 是由Google公司开发的地图软件。谷歌地球采用了…...
2025年数维杯赛题C题专家 组委会C题专家疑集锦
1、段前段后距,行间距有要求嘛 C题专家:一般是单倍行距 2、请问参考文献和附录上方也要有图示页眉吗?ai使用报告放在附录里还是附录之后? C题专家:附录 3、第三问的那个三天都在一个城市可以吗?这样我们列两份城市的清明自由行,还是说…...
C.循环函数基础
循环函数基础 1. 循环函数基础1.1 循环的定义与作用1.1.1 `for` 循环语法示例1.1.2 `while` 循环语法示例1.1.3 `do-while` 循环语法示例1.1.4 循环的比较1.1.5 循环的应用场景2.1 for 循环语法结构执行流程示例应用场景优点缺点2.2 while 循环语法结构执行流程示例应用场景优点…...
spark-Join Key 的基数/rand函数
在数据处理中,Join Key 的基数 是指 Join Key 的唯一值的数量(也称为 Distinct Key Count)。它表示某个字段(即 Join Key)在数据集中有多少个不同的值。 1. Join Key 基数的意义 高基数:Join Key 的唯一值…...
【Oracle认证】MySQL 8.0 OCP 认证考试英文版(MySQL30 周年版)
文章目录 1、MySQL OCP考试介绍2、考试注册流程3、考试复习题库 Oracle 为庆祝 MySQL 30 周年,截止到2025.07.31 之前。所有人均可以免费考取原价245美元 (约1500)的MySQL OCP 认证。 1、MySQL OCP考试介绍 OCP考试 OCP认证是Oracle公司推…...
不同环境下运行脚本如何解决pythonpath问题
目录 问题背景: 方法一:在 Dockerfile 中设置 PYTHONPATH: 方法二: 本地脚本内动态地设置 sys.path,以确保 Python 程序在运行时能够找到项目中的模块 注意: 问题背景: 脚本在windows环境定义 然后因为…...
照片to谷歌地球/奥维地图使用指南
软件介绍 照片to谷歌地球/奥维地图是一款由WTSolutions开发的跨平台图片处理工具,能够将带有GPS信息的照片导入Google Earth(谷歌地球)或奥维地图。该软件支持Windows、Mac、iOS、Linux和Android系统,无需下载安装,直…...
visual studio 2015 安装闪退问题
参考链接: VS2012安装时启动界面一闪而过问题解决办法 visual studio 2015 安装闪退问题...
Kubernetes 使用 containerd 实现 GPU 支持及 GPU Operator 部署指南
目录 Kubernetes 使用 containerd 实现 GPU 支持及 GPU Operator 部署指南 一、为什么 containerd 是趋势? 二、目标 三、前提条件 四、方式一:containerd nvidia-container-toolkit(基础方式) 1️⃣ 安装 NVIDIA Containe…...
【typenum】 1 说明文件(README.md)
Typenum Typenum 是一个用于在编译时计算类型级数字的 Rust 库。目前支持位、无符号整数和有符号整数。 Typenum 仅依赖 libcore,因此适用于任何平台! 导入方式 虽然 typenum 分为多个模块,但它们都通过 crate 根目录重新导出,…...
Axure疑难杂症:统计分析页面引入Echarts示例动态效果
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:统计分析页面引入Echarts示例动态效果 主要内容:echart示例引入、大小调整、数据导入 应用场景:统计分析页面…...
PyQt5基本窗口控件(QWidget)
QWidget 基础窗口控件QWidget类是所有用户界面对象的基类,所有的窗口和控件都直 接或间接继承自QWidget类。 窗口控件(Widget,简称“控件”)是在PyQt中建立界面的主要元素。在PyQt 中把没有嵌入到其他控件中的控件称为窗口&…...
双目视觉系统中,极线校正(Epipolar Rectification)与单应性矩阵/多平面单应性模型
在双目视觉系统中,极线校正(Epipolar Rectification)的目标是使左右图像的对应点位于同一水平线上,从而简化立体匹配的搜索过程。标准的双目相机标定和校正流程,其核心原理与单应性矩阵的应用方式如下: 1. …...
【部署】win10的wsl环境下调试dify的api后端服务
回到目录 标题:win10的wsl环境下,远程调试dify的api后端服务 0. 上一篇讲解web前端服务的启动方法,本篇内容是vscode的调试模式启动api后端服务。文章4000字左右,阅读时间15-20分钟。 dify官方运行环境要求较低2U4G,…...
学习黑客了解Python3的“HTTPServer“
5 分钟深入浅出理解Python3的"HTTPServer"模块 🌐 大家好!今天我们将探索Python3中的HTTPServer模块——一个简单却强大的工具,它允许你快速创建web服务器。在网络安全学习、渗透测试和CTF挑战中,这个模块常被用来搭建…...
结合 ECharts / Ant Design Blazor 构建高性能实时仪表盘
📊 结合 ECharts / Ant Design Blazor 构建高性能实时仪表盘 文章目录 📊 结合 ECharts / Ant Design Blazor 构建高性能实时仪表盘一、前言 🔍二、技术选型 🧰三、项目配置与架构 🏗️🌐 系统整体架构流程…...
刘强东杀入自动驾驶!京东注册“Joyrobotaxi”商标
又一个互联网大佬杀入汽车赛道!这一次,是京东的刘强东。5月6日,京东集团旗下公司一口气申请注册了多个名为"Joyrobotaxi"的商标,国际分类涵盖运输工具、科学仪器等核心领域。这一动作被业界普遍解读为:京东要…...
JavaScript基础-switch分支流程控制
在JavaScript编程中,switch语句提供了一种清晰、简洁的方式来实现多路分支选择。相比于多个if...else if语句,switch语句可以使代码更加易读和易于维护,尤其是在需要根据单个变量或表达式的值进行不同路径选择时尤为有用。本文将详细介绍swit…...
MySQL:视图
目录 一、什么是视图 二、视图的创建和使用 三、修改数据 (1)修改真实表 (2)修改视图 四、删除视图 五、视图的优点 一、什么是视图 视图是一个虚拟的表,它是基于一个或多个基本表或其他视图的查询结果集。视…...
05 mysql之DDL
一、SQL的四个分类 我们通常可以将 SQL 分为四类,分别是: DDL(数据定义语言)、DML(数据操作语言)、 DCL(数据控制语言)和 TCL(事务控制语言)。 DDL 用于创建…...
各国GDP变化趋势网页特效(实用动态图表)完整实例
https://download.csdn.net/download/YUJIANYUE/90803109...
【部署】win10的wsl环境下启动dify的web前端服务
回到目录 标题:win10的wsl环境下启动dify的web前端服务 0. 官网安装指引 官网有详细的源代码部署说明,参考: https://docs.dify.ai/en/getting-started/install-self-hosted/local-source-code 1. 安装nodejs 1.1. 下载和解压文件 参考:https://no…...
Veins同时打开SUMO和OMNeT++的GUI界面
进入 Veins 工程目录(即包含 sumo-launchd.py 的目录),打开终端设置 SUMO_HOME 环境变量(指向你安装的 SUMO 路径): export SUMO\_HOME/home/veins/src/sumo-1.11.0编译 Veins 工程(包含 OMNeT…...
模型 启动效应
系列文章分享模型,了解更多👉 模型_思维模型目录。刺激先行激活,后续认知更顺畅。 1 启动效应的应用 1.1 求职面试中对面试官的影响 背景:一家知名公司在招聘过程中发现,面试官对候选人的评价往往受到多种因素的影响…...
Android 使用Paging3 实现列表分页加载、下拉刷新、错误重试、筛选功能
Android 使用Paging3 实现列表加载 Paging3是Android Jetpack组件库中的分页加载库,它可以帮助开发者轻松实现列表数据的分页加载功能。本文将逐步讲解如何使用Paging3库实现一个带有加载更多、下拉刷新、错误重试、筛选功能的列表页面。 最终效果如下 加载更多、…...
SpringBoot2集成xxl-job详解
官方教程 搭建调度中心 Github Gitee 注:版本3.x开始要求Jdk17;版本2.x及以下支持Jdk1.8。如对Jdk版本有诉求,可选择接入不同版本 clone源代码执行xxl-job\doc\db\tables_xxl_job.sql # # XXL-JOB v2.4.1 # Copyright (c) 2015-present, x…...
洛图报告中的 FSHD 是什么?—— 解密九天画芯推动的三色光源显示技术
目录 一、洛图报告新焦点:FSHD 为何成为显示产业重要突破方向? (一)洛图报告核心结论:从技术突围到产业重构 二、技术解析:FSHD 如何重构显示底层逻辑? (一)物理架构…...
关于数据库查询速度优化
本人接手了一个关于项目没有任何文档信息的代码,代码也没有相关文档说明信息!所以在做数据库查询优化的时候不敢改动。 原因1: 老板需要我做一个首页的统计查询。明明才几十万条数据,而且我加了筛选条件为什么会这么慢ÿ…...
两数相加(2)
2. 两数相加 - 力扣(LeetCode) 解法: class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode * dummy new ListNode(0);int carry 0;ListNode * head dummy;while (l1 ! nullptr || l2 ! nullptr ||…...