C语言如何解析JSON数据
json
适用于现代 C++ 的 JSON。
项目地址:https://gitcode.com/gh_mirrors/js/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;
}
GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e
3 个月前
8c391e04
6 个月前
更多推荐
已为社区贡献3条内容
所有评论(0)