当前位置:   article > 正文

C语言如何解析JSON数据_c语言解析json字符串

c语言解析json字符串

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

1、strstr函数

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

函数原型如下:

  1. char *strstr(const char *haystack, const char *needle);
  2. haystack 是要搜索的字符串,needle 是要查找的子字符串。
  3. 函数返回一个指向第一次出现 needle 的位置的指针,如果没有找到则返回 NULL

2、strcmp函数

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

函数原型如下:

  1. int strcmp(const char *str1, const char *str2);
  2. 其中 str1 和 str2 分别是要比较的两个字符串。
  3. 函数返回一个整数值,表示两个字符串的大小关系:
  4. 如果 str1 小于 str2,则返回一个负数。
  5. 如果 str1 等于 str2,则返回 0
  6. 如果 str1 大于 str2,则返回一个正数。

3、strtok函数

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

函数原型如下:

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

4、atoi函数

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

函数原型如下:

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

5、strcpy函数

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

函数原型如下:

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

6、strchr函数

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

函数原型如下:

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

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. char str[300]= "{\"method\":\"thing.service.property.set\",\"id\":\"463160838\",\"params\":{\"Humidity\":25,\"temperature\":25,\"infor\":\"ijj\"},\"version\":\"1.0.0\"}";
  5. int humidity,temperature;
  6. char infor[100];
  7. void parseJSON1(char *jsonData) {
  8. char *token = strtok(jsonData, "{},\":");
  9. while (token != NULL) {
  10. printf("%s\r\n",token);
  11. if (strcmp(token, "Humidity") == 0) {
  12. token = strtok(NULL, "{},\":");
  13. humidity = atoi(token);
  14. } else if (strcmp(token, "temperature") == 0) {
  15. token = strtok(NULL, "{},\":");
  16. temperature = atoi(token);
  17. }
  18. else if(strcmp(token, "infor") == 0)
  19. {
  20. token = strtok(NULL, "{},\":");
  21. strcpy(infor,token);
  22. }
  23. token = strtok(NULL, "{},\":");
  24. }
  25. }
  26. int main()
  27. {
  28. parseJSON1(str);
  29. printf(" humidity %d\r\n",humidity);
  30. printf(" temperature %d\r\n",temperature);
  31. printf(" infor %s\r\n",infor);
  32. }

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. char str[300]= "{\"method\":\"thing.service.property.set\",\"id\":\"463160838\",\"params\":{\"Humidity\":25,\"temperature\":25,\"infor\":\"ijj\"},\"version\":\"1.0.0\"}";
  5. int humidity,temperature;
  6. char infor[100];
  7. void parseJSON1(char* jsonData) {
  8. char *token = strtok(jsonData, "{},\":");
  9. while (token != NULL) {
  10. printf("%s\r\n",token);
  11. if (strcmp(token, "Humidity") == 0) {
  12. token = strtok(NULL, "{},\":");
  13. humidity = atoi(token);
  14. } else if (strcmp(token, "temperature") == 0) {
  15. token = strtok(NULL, "{},\":");
  16. temperature = atoi(token);
  17. }
  18. else if(strcmp(token, "infor") == 0)
  19. {
  20. token = strtok(NULL, "{},\":");
  21. strcpy(infor,token);
  22. }
  23. token = strtok(NULL, "{},\":");
  24. }
  25. }
  26. int main()
  27. {
  28. char temp[200];
  29. strcpy(temp,str);
  30. parseJSON1(temp);
  31. printf(" humidity %d\r\n",humidity);
  32. printf(" temperature %d\r\n",temperature);
  33. printf(" infor %s\r\n",infor);
  34. }

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. char str[300]= "{\"method\":\"thing.service.property.set\",\"id\":\"463160838\",\"params\":{\"Humidity\":25,\"temperature\":25,\"infor\":\"ijj\"},\"version\":\"1.0.0\"}";
  5. int humidity,temperature;
  6. char infor[100];
  7. void parseJSON2(char *jsonData) {
  8. char* softwareInfoStart = strstr(jsonData, "infor");
  9. if (softwareInfoStart != NULL)
  10. {
  11. softwareInfoStart += 8;
  12. char* softwareInfoEnd = strchr(softwareInfoStart, '"');
  13. if (softwareInfoEnd != NULL)
  14. {
  15. int length = softwareInfoEnd - softwareInfoStart;
  16. strncpy(infor, softwareInfoStart, length);
  17. infor[length] = '\0';
  18. }
  19. }
  20. }
  21. int main()
  22. {
  23. parseJSON2(str);
  24. printf(" humidity %d\r\n",humidity);
  25. printf(" temperature %d\r\n",temperature);
  26. printf(" infor %s\r\n",infor);
  27. }

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

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main() {
  4. char input[] = "{\"method\":\"thing.service.property.set\",\"id\":\"463160838\",\"params\":{\"Humidity\":25,\"temperature\":25,\"infor\":\"ijj\"},\"version\":\"1.0.0\"}";
  5. int id,humidity,temperature;
  6. char infor[100];
  7. sscanf(input, "{\"method\":\"thing.service.property.set\",\"id\":\"%d\",\"params\":{\"Humidity\":%d,\"temperature\":%d,\"infor\":\"%s\"},\"version\":\"1.0.0\"}",&id ,&humidity,&temperature,infor);
  8. //因为char型的地址是连续的,所以需要人为的加入\0结束符
  9. for(int i=0;;i++)
  10. {
  11. if(infor[i]=='"')
  12. {
  13. infor[i]='\0';
  14. break;
  15. }
  16. }
  17. printf("humidity:%d\n", humidity);
  18. printf("temperature:%d\n", temperature);
  19. printf("infor:%s\n", infor);
  20. return 0;
  21. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/729355
推荐阅读
相关标签
  

闽ICP备14008679号