C语言如何解析JSON数据

一、了解需要使用的C语言函数

1、strstr函数

用于在一个字符串中查找另一个字符串第一次出现的位置。

函数原型如下:

char *strstr(const char *haystack, const char *needle);

haystack 是要搜索的字符串,needle 是要查找的子字符串。
函数返回一个指向第一次出现 needle 的位置的指针,如果没有找到则返回 NULL。

2、strcmp函数

一个字符串处理函数,用于比较两个字符串的大小关系。

函数原型如下:

int strcmp(const char *str1, const char *str2);

其中 str1 和 str2 分别是要比较的两个字符串。
函数返回一个整数值,表示两个字符串的大小关系:
如果 str1 小于 str2,则返回一个负数。
如果 str1 等于 str2,则返回 0。
如果 str1 大于 str2,则返回一个正数。

3、strtok函数

用于将字符串分割成子字符串的函数,通常用于按照指定的分隔符将一个字符串拆分成多个部分。

函数原型如下:

char *strtok(char *str, const char *delim);

str 是要分割的字符串,delim 是用来指定分隔符的字符串。
第一次调用 strtok 时,需要传入要分割的字符串 str,后续调用则传入 NULL。
每次调用 strtok 都会返回一个指向下一个子字符串的指针,直到字符串被完全分割。

4、atoi函数

用于将字符串转换为整数(int 类型)

函数原型如下:


int atoi(const char *str);

str 是一个指向以 null 结尾的字符串的指针,表示要转换为整数的字符串。
atoi 函数会将输入的字符串转换为整数值,并返回转换后的整数。如果字符串的开头是数字字符(0-9),atoi 会从这个位置开始转换,直到遇到非数字字符为止。如果字符串的开头不是数字字符,则返回 0。

5、strcpy函数

将一个字符串拷贝到另一个字符串中

函数原型如下:

char *strcpy(char *dest, const char *src);

dest 是目标字符串,即要将源字符串拷贝到的位置。
src 是源字符串,即要被拷贝的字符串。
strcpy 函数会将源字符串的内容复制到目标字符串中,直到遇到源字符串的结束符(\0)为止。
目标字符串必须足够大,以容纳源字符串的内容,否则可能会导致缓冲区溢出。

6、strchr函数

用于在字符串中查找指定字符的第一个匹配位置。

函数原型如下:

char *strchr(const char *str, int c);

str 是要在其中查找字符的字符串。
c 是要查找的字符。
strchr 函数会在 str 指向的字符串中查找第一个匹配字符 c 的位置,并返回指向该位置的指针。
如果找到了匹配字符,返回的指针指向该字符;如果未找到匹配字符,返回空指针(NULL)。

二、编写代码获取JSON数据,方法1

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

char str[300]= "{\"method\":\"thing.service.property.set\",\"id\":\"463160838\",\"params\":{\"Humidity\":25,\"temperature\":25,\"infor\":\"ijj\"},\"version\":\"1.0.0\"}";

int humidity,temperature;
char infor[100];
			
void parseJSON1(char *jsonData) {
    char *token = strtok(jsonData, "{},\":");
    while (token != NULL) {
    	printf("%s\r\n",token);
        if (strcmp(token, "Humidity") == 0) {
            token = strtok(NULL, "{},\":");
            humidity = atoi(token);
        } else if (strcmp(token, "temperature") == 0) {
            token = strtok(NULL, "{},\":");
            temperature = atoi(token);
        } 
        else if(strcmp(token, "infor") == 0)
        {
        	token = strtok(NULL, "{},\":");
        	strcpy(infor,token);
		}
        token = strtok(NULL, "{},\":");
    }
}

int main()
{
	parseJSON1(str);
	printf(" humidity %d\r\n",humidity);
	printf(" temperature %d\r\n",temperature);
	printf(" infor %s\r\n",infor);
}

切记:调用完parseJSON1(str);函数后str的值会被改变,所以我们应该先拷贝一份值,在传入

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

char str[300]= "{\"method\":\"thing.service.property.set\",\"id\":\"463160838\",\"params\":{\"Humidity\":25,\"temperature\":25,\"infor\":\"ijj\"},\"version\":\"1.0.0\"}";

int humidity,temperature;
char infor[100];
			
void parseJSON1(char* jsonData) {
	
    char *token = strtok(jsonData, "{},\":");
    while (token != NULL) {
    	printf("%s\r\n",token);
        if (strcmp(token, "Humidity") == 0) {
            token = strtok(NULL, "{},\":");
            humidity = atoi(token);
        } else if (strcmp(token, "temperature") == 0) {
            token = strtok(NULL, "{},\":");
            temperature = atoi(token);
        } 
        else if(strcmp(token, "infor") == 0)
        {
        	token = strtok(NULL, "{},\":");
        	strcpy(infor,token);
		}
        token = strtok(NULL, "{},\":");
    }
}


int main()
{
	char temp[200];
	strcpy(temp,str);
	parseJSON1(temp);
	printf(" humidity %d\r\n",humidity);
	printf(" temperature %d\r\n",temperature);
	printf(" infor %s\r\n",infor);
}

三、编写代码获取JSON数据,方法2

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

char str[300]= "{\"method\":\"thing.service.property.set\",\"id\":\"463160838\",\"params\":{\"Humidity\":25,\"temperature\":25,\"infor\":\"ijj\"},\"version\":\"1.0.0\"}";

int humidity,temperature;
char infor[100];
			
void parseJSON2(char *jsonData) {
	char* softwareInfoStart = strstr(jsonData, "infor");
	if (softwareInfoStart != NULL) 
	{
		softwareInfoStart += 8;
		char* softwareInfoEnd = strchr(softwareInfoStart, '"');
		if (softwareInfoEnd != NULL) 
		{
			int length = softwareInfoEnd - softwareInfoStart;
			strncpy(infor, softwareInfoStart, length);
			infor[length] = '\0';
		}
	}
}

int main()
{
	parseJSON2(str);
	printf(" humidity %d\r\n",humidity);
	printf(" temperature %d\r\n",temperature);
	printf(" infor %s\r\n",infor);
}

三、编写代码获取JSON数据,方法3

#include <stdio.h>
#include <string.h>

int main() {
    char input[] = "{\"method\":\"thing.service.property.set\",\"id\":\"463160838\",\"params\":{\"Humidity\":25,\"temperature\":25,\"infor\":\"ijj\"},\"version\":\"1.0.0\"}";
    int id,humidity,temperature;
    char infor[100];

    sscanf(input, "{\"method\":\"thing.service.property.set\",\"id\":\"%d\",\"params\":{\"Humidity\":%d,\"temperature\":%d,\"infor\":\"%s\"},\"version\":\"1.0.0\"}",&id ,&humidity,&temperature,infor);

//因为char型的地址是连续的,所以需要人为的加入\0结束符
    for(int i=0;;i++)
    {
    	if(infor[i]=='"')
    	{
    		infor[i]='\0';
    		break;
		}
	}
    
	printf("humidity:%d\n", humidity);
	printf("temperature:%d\n", temperature);
	printf("infor:%s\n", infor);
	
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt常用基础控件总结

一、按钮部件 按钮部件共同特性 Qt 用于描述按钮部件的类、继承关系、各按钮的名称和样式,如下图: 助记符:使用字符"&“可在为按钮指定文本标签时设置快捷键,在&之后的字符将作为快捷键。比如 “A&BC” 则 Alt+B 将成为该按钮的快捷键,使用”&&qu…

基于FPGA实现的HDMI TO MIPI扩展显示器方案

FPGA方案&#xff0c;HDMI IN接收原始HDMI 信号&#xff0c;输出显示到LCD 屏上 客户应用&#xff1a;扩展显示器 主要特性&#xff1a; 1.支持2K以下任意分辨率显示 2.支持OSD 叠加多个图层 3.支持MIPI/EDP/LVDS/RGB屏 4.支持放大缩小匹配屏分辨率 5.零延时&#xff0c;输…

算法设计课第五周(贪心法实现活动选择问题)

目录 一、【实验目的】 二、【实验内容】 三、实验源代码 一、【实验目的】 &#xff08;1&#xff09;熟悉贪心法的设计思想 &#xff08;2&#xff09;理解贪心法的最优解与正确性证明之间的关系 &#xff08;3&#xff09;比较活动选择的各种“贪心”策略&#xff0c;…

Navicat连接远程数据库时,隔一段时间不操作出现的卡顿问题

使用 Navicat 连接服务器上的数据库时&#xff0c;如果隔一段时间没有使用&#xff0c;再次点击就会出现卡顿的问题。 如&#xff1a;隔一段时间再查询完数据会出现&#xff1a; 2013 - Lost connection to MySQL server at waiting for initial communication packet, syste…

上位机图像处理和嵌入式模块部署(树莓派4b读写json数据)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;ini文件是用来进行配置的&#xff0c;数据库是用来进行数据存储的。那json是用来做什么的呢&#xff0c;json一般是用来做…

C++学习进阶:C++11线程库

目录 前言&#xff1a; 1.线程库的使用 1.1.thread库 1.2.mutex库 1.3.condition_variable库 1.4.atomic库 2.线程安全问题 2.1.智能指针 2.2.STL容器 前言&#xff1a; 操作系统&#xff1a;线程-CSDN博客 我们曾经在这篇博客中提及了“语言”和“pthread库”之间的…

Flutter 引入webview_windows插件,在已经使用$PATH 中的 nuget.exe情况下,windows端构建失败

报错 PS F:\xx\xxxx> flutter run -d windows Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source! Launching lib\main.dart on Windows in debug mode... E:\Some software\Visual Studio\VS 2022\MSBuild\M…

JavaScript 进阶征途:解锁Function奥秘,深掘Object方法精髓

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f235;Function方法 与 函数式编程&#x1f49d;1 call &#x1f49d…

Linux|进程控制

进程创建 fork函数初识 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 返回值&#xff1a;子进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1 进程调用fork&#xff0c;当…

ICode国际青少年编程竞赛- Python-2级训练场-数独

ICode国际青少年编程竞赛- Python-2级训练场-数独 1、 Spaceship.step(3)2、 Spaceship.step(3)3、 Spaceship.step(1) Spaceship.turnLeft() Spaceship.step(1)4、 Spaceship.step(3) Spaceship.turnRight() Spaceship.step(1)5、 Spaceship.step(4) for i in range(3):Spaces…

企业级通用业务 Header 处理方案

目录 01: 处理 PC 端基础架构 02: 通用组件&#xff1a;search 搜索框能力分析 03: 通用组件&#xff1a;search 搜索框样式处理 04: 通用组件&#xff1a;Button 按钮能力分析 05: 通用组件&#xff1a;Button 按钮功能实现 06: 通用组件&#xff1a;完善 search 基本…

MySQL学习笔记11——数据备份 范式 ER模型

数据备份 & 范式 & ER模型 一、数据备份1、如何进行数据备份&#xff08;1&#xff09;备份数据库中的表&#xff08;2&#xff09;备份数据库&#xff08;3&#xff09;备份整个数据库服务器 2、如何进行数据恢复3、如何导出和导入表里的数据&#xff08;1&#xff09…

ARP命令

按照缺省设置&#xff0c;ARP高速缓存中的项目是动态的&#xff0c;每当发送以恶个指定的数据报且高速缓存中不存在当前项目时&#xff0c;ARP便会自动添加该项目。一旦高速缓存的项目被输入&#xff0c;就已经开始走向失效状态。因此&#xff0c;如果ARP高速缓存中的项目很少或…

擎天科技与禅道合作,打造统一的项目管理平台

统一、全面的项目管理平台能够帮助企业优化管理流程&#xff0c;提升业务效率。擎天集团选择与禅道软件合作&#xff0c;打造统一的项目管理平台&#xff0c;在降低自研软件的研发成本、打破团队信息孤岛、保障数据全面性等方面效果显著&#xff0c;大大提高了团队沟通协作效率…

如何使用 ArcGIS Pro 计算容积率

容积率是指地上建筑物的总面积与用地面积的比率&#xff0c;数值越小越舒适&#xff0c;这里为大家介绍一下如何使用ArcGIS Pro 计算容积率&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的建筑和小区数据&#xff0c;除了建筑和小区数据&am…

verilog中不重叠序列检测

编写一个序列检测模块&#xff0c;检测输入信号&#xff08;a&#xff09;是否满足011100序列&#xff0c; 要求以每六个输入为一组&#xff0c;不检测重复序列&#xff0c;例如第一位数据不符合&#xff0c;则不考虑后五位。一直到第七位数据即下一组信号的第一位开始检测。当…

AngularJS基本概念

版本&#xff1a; AngularJs 1.x&#xff1a;https://angularjs.org/ AngularJs 2&#xff1a;https://angular.io/ 或 https://angular.cn/ 实现语言&#xff1a; Angular 1.x&#xff1a;使用ES(avaScript)编写&#xff0c;可直接在浏览器中运行。 Angular 2&#xff1a…

Electron-Vue 脚手架避坑实录,兼容Win11,升级electron22,清理控制台错误

去年的还是有用的&#xff0c;大家继续看&#xff0c;今年再补充一些Electron-Vue 异常处理方案 M1 和 Window10_electron异常处理-CSDN博客 代码gitee.com地址 electron-demo: electron 22 初始代码开发和讲解 升级electron为22版本&#xff08;这个版本承上启下&#xff0c…

内网穿透速度慢

内网穿透速度慢原因及优化策略 在计算机网络应用中&#xff0c;内网穿透是一个常见的需求&#xff0c;它允许外部网络访问位于内部网络&#xff08;如企业局域网或家庭网络&#xff09;中的设备或服务。然而&#xff0c;有时用户在进行内网穿透时会遇到速度慢的问题&#xff0…

【二次元MMORPG游戏开发】任务系统技术拆解

引言 各位同学大家好。在今天的分享当中&#xff0c;我将对任务系统去做一个拆解。也许你见过很多任务系统&#xff0c;但是今天我要分享的是我们经过一个框架迭代以后的任务系统。我会结合客户端的功能演示给大家去讲解。 跟着演示学开发 基本操作 好&#xff0c;首先我们点…
最新文章