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;
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值