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.mzph.cn/news/834175.shtml

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

相关文章

堆的应用2——TOPK问题

TOPK问题 TOP-K问题&#xff1a;即求数据结合中前K个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大。 比如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 情况1——数据量小 对于Top-K问题&#xff0c;能想到的最简单直接的方式就…

JSONArray怎么通过jsonObject中的某个属性值进行分组

Java JSONArray怎么通过jsonObject中的某个属性值进行分组 在Java中&#xff0c;可以使用JSONArray和JSONObject来处理JSON数据。如果你想要通过jsonObject中的某个属性值对JSONArray进行分组&#xff0c;可以使用Java 8的Stream API来简化操作。 以下是一个简单的例子&#…

嵌入式C语言高级教程:实现基于STM32的自适应交通信号控制系统

自适应交通信号控制系统能够基于实时交通流数据调整信号灯的时长&#xff0c;提高路口的通行效率。本教程将指导您如何在STM32微控制器上实现一个基本的自适应交通信号控制系统。 一、开发环境准备 硬件要求 微控制器&#xff1a;STM32F103C8&#xff0c;具备足够的处理能力…

Eclipse下载安装教程(包含JDK安装)【保姆级教学】【2023.10月最新版】

目录 文章最后附下载链接 第一步&#xff1a;下载Eclipse&#xff0c;并安装 第二步&#xff1a;下载JDK&#xff0c;并安装 第三步&#xff1a;Java运行环境配置 安装Eclipse必须同时安装JDK &#xff01;&#xff01;&#xff01; 文章最后附下载链接 第一步&#xf…

使用Python和MoviePy库实现视频拼接与合成的技巧与实践

首先&#xff0c;我们需要导入所需的库&#xff1a; from moviepy.editor import VideoFileClip, concatenate_videoclips, AudioFileClip, CompositeVideoClip, ColorClip import os import random from typing import List from enum import Enum 接下来&#xff0c;我们定义…

Git如何查看有多少个分支、创建分支、切换分支

2024年5月9日&#xff0c;周四上午 在 Git 中&#xff0c;新建一个分支是非常简单的。以下是如何操作的步骤&#xff1a; 查看现有分支&#xff1a;git branch这个命令会列出当前仓库中的所有本地分支。创建新分支&#xff1a;git branch <new-branch-name>这个命令会创…

[法规规划|数据概念]金融行业数据资产和安全管理系列文件解析(3)

“ 金融行业在自身数据治理和资产化建设方面一直走在前列。” 一直以来&#xff0c;金融行业由于其自身需要&#xff0c;都是国内开展信息化建设最早&#xff0c;信息化程度最高的行业。 在当今数据要素资产化的浪潮下&#xff0c;除了行业自身自身数据治理和资产化建设方面&am…

EditReady for Mac激活版:专业视频转码工具

对于视频专业人员来说&#xff0c;一款高效的视频转码工具是不可或缺的。EditReady for Mac正是这样一款强大的工具&#xff0c;它拥有简洁直观的操作界面和强大的功能&#xff0c;让您的视频处理工作事半功倍。 EditReady for Mac支持多种视频格式的转码&#xff0c;并且支持常…

【AIGC调研系列】红帽的RHEL AI能够做什么

红帽的RHEL AI&#xff08;Red Hat Enterprise Linux AI&#xff09;是一个基于开源项目InstructLab和IBM Research提供的Granite大型语言模型的基础模型平台。它旨在无缝开发、测试和运行生成式AI模型&#xff0c;以支持企业应用程序[1][2][5]。 具体来说&#xff0c;RHEL AI…

Java护照识别接口开发示例、文字识别、证件识别

护照是我们出国旅行时所必要的证件之一&#xff0c;他是我国公民去外国的旅行和工作的时候所代表的一个合法的身份证件。 在护照上面也有不少关于我们个人身份的信息&#xff0c;而手动去录入如此多的身份信息这绝对是灾难。不仅证件&#xff0c;有的场景还需要录入很多文字信息…

React 之 记忆化函数cache(十四)

const result cache&#xff08;fn&#xff09;方法&#xff1a; fn&#xff1a;要对其结果进行缓存的函数。fn 可以接受任何参数并返回任何值。 返回值result : 返回一个与 fn 具有相同类型签名的已缓存版本。在此过程中&#xff0c;它不会调用 fn。 cache 用法 import {cac…

【Java】初识网络编程

文章目录 前言✍一、互联网的发展1.独立模式2.网络的出现局域网LAN广域网WAN ✍二、网络编程概述✍三、网络编程中的术语介绍IP地址端口号协议OSI七层模型TCP\IP四层模型 ✍四、协议的层级之间是如何配合工作的 前言 在本文中&#xff0c;会对网络编程的一些术语进行解释&#…

动态规划——路径问题:931.下降路径最小和

文章目录 题目描述算法原理1.状态表示&#xff08;经验题目&#xff09;2.状态转移方程3.初始化4.填表顺序5.返回值 代码实现CJava 题目描述 题目链接&#xff1a;931.下降路径最小和 关于这⼀类题&#xff0c;看过我之前的博客的朋友对于状态表示以及状态转移是⽐较容易分析…

5分钟了解下HDFS

随着大数据时代的到来&#xff0c;传统的数据存储和管理方式已经无法满足日益增长的数据处理需求。HDFS&#xff08;Hadoop Distributed File System&#xff09;作为Apache Hadoop项目的一部分&#xff0c;以其高度的容错性、可扩展性和高吞吐量&#xff0c;成为了处理大规模数…

抖音APP运用的AI技术拆解

1.推荐系统&#xff08;RS&#xff09; 用户画像&#xff1a;根据用户的信息&#xff08;如地区、性别、年龄、收藏、关注......&#xff09;进行分析&#xff0c;构建用户画像&#xff0c;对用户进行分类&#xff1b; 行为分析&#xff1a;将用户的显形行为数据&#xff08;如…

搜维尔科技:OptiTrack是基于LED墙虚拟制作舞台的最佳选择

OptiTrack因其绝对精度、易用性、可靠性以及与现场工具的完美集成而被选中&#xff0c;仍然是全球首屈一指的基于 LED 墙的虚拟制作舞台的选择。 当今虚拟制作阶段的低延迟、超精确摄像机跟踪标准 /- 0.2 毫米 位置精度1 < 10 毫秒 系统延迟 /- 0.1 度 旋转精度2 电影…

Linux 操作系统网络编程1

目录 1、网络编程 1.1 OSI 网络七层模型 1.1.1 OSI 参考模型 1.1.2 网络数据传输过程 2 传输层通信协议 2.1 TCP 2.1.1 TCP的3次握手过程 2.1.2 TCP四次挥手过程 2.2 UDP 3 网络编程的IP地址 4 端口 5 套接字 1、网络编程 1.1 OSI 网络七层模型 1.1.1 OSI 参考模型…

vue根据文字动态判断溢出...鼠标悬停显示el-tooltip展示

使用自定义el- tooltip 组件 定义 Tooltip是一种小型弹出框&#xff0c;它显示有关特定页面元素的信息&#xff0c;例如按钮、链接或图标。Tooltip通常以半透明的气泡形式呈现&#xff0c;并出现在页面元素的旁边或下方。 它可以改善用户体验&#xff0c;使用户更容易理解页面…

Linux cmake 初窥【3】

1.开发背景 基于上一篇的基础上&#xff0c;已经实现了多个源文件路径调用&#xff0c;但是没有库的实现 2.开发需求 基于 cmake 的动态库和静态库的调用 3.开发环境 ubuntu 20.04 cmake-3.23.1 4.实现步骤 4.1 准备源码文件 基于上个试验的基础上&#xff0c;增加了动态库…

优思学院|精益六西格玛黑带培训的内容有哪些?【附思维导图】

引言 在现代企业中&#xff0c;精益六西格玛黑带&#xff08;或称六西格玛黑带&#xff09;处于实施六西格玛方法的最前线。然而&#xff0c;他们的职责远不止执行者的角色。黑带既学习六西格玛的工具&#xff0c;又主导项目以改进绩效指标。在更长远的角度看&#xff0c;他们…