找回密码
 立即注册
首页 业界区 安全 基于服务器响应的实时天气数据进行JSON解析的详细代码及 ...

基于服务器响应的实时天气数据进行JSON解析的详细代码及其框架

庾签 2025-6-8 13:24:24
  1. #include <netinet/in.h>
  2. #include
  3. #include <stdio.h>
  4. #include <errno.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <netinet/ip.h>
  8. #include
  9. #include <sys/socket.h>
  10. #include <netinet/in.h>
  11. #include <netinet/udp.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <sys/types.h>
  15. #include <unistd.h>
  16. #include "cJSON.h"
  17. #define PORT 80  //端口号
  18. #define IPADDR "116.62.81.138"//地址
  19. #define KEY "需要手动添加" // 私钥
  20. #define LOCAL "选择想要查看的城市" //城市
  21. int main(int argc, char const *argv[])
  22. {
  23.     // 1.创建TCP套接字
  24.     int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
  25.     //错误处理
  26.     if (tcp_socket == -1)
  27.     {
  28.         fprintf(stderr, "tcp socket error,errno:%d,%s\n", errno, strerror(errno));
  29.         exit(1);
  30.     }
  31.     // 2.发起连接请求,等待接受服务器接受连接
  32.     struct sockaddr_in dest_addr;
  33.     dest_addr.sin_family = AF_INET;                // 协议族,是固定的
  34.     dest_addr.sin_port = htons(PORT);              // 服务器端口,必须转换为网络字节序
  35.     dest_addr.sin_addr.s_addr = inet_addr(IPADDR); // 服务器地址
  36.     //ret用来进行下一步的connect连接是否成功进行判断
  37.     int ret = connect(tcp_socket, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
  38.     //ret = 0连接成功,ret = -1连接失败
  39.     if (ret < 0)
  40.     {
  41.         fprintf(stderr, "connect error,errno:%d,%s\n", errno, strerror(errno));
  42.         exit(1);
  43.     }
  44.     // 3.用于存储HTTP的请求内容: 请求行(HRI+(空格))+ 请求字段 + \r\n + 请求包体(可选)+\r\n
  45.     char reqbuf[1024] = {0};
  46.     sprintf(reqbuf, "GET https://api.seniverse.com/v3/weather/now.json?key=%s&location=%s&language=en&unit=c "
  47.                     "HTTP/1.1"
  48.                     "\r\n"
  49.                     "Host:api.seniverse.com\r\n"
  50.                     "\r\n",
  51.             KEY, LOCAL);
  52.     // 4.说明双方建立连接,此时可以利用HTTP协议发送请求信息,并等待服务器的响应  基于请求/响应
  53.     send(tcp_socket, reqbuf, strlen(reqbuf), 0);
  54.     // 5.等待服务器的响应
  55.     char recvbuf[1024] = {0};
  56.     recv(tcp_socket, recvbuf, sizeof(recvbuf), 0); // 第一次返回的响应参数
  57.     printf("%s", recvbuf);
  58.     bzero(recvbuf, 1024);
  59.     recv(tcp_socket, recvbuf, sizeof(recvbuf), 0); // 第二次返回的响应包体
  60.     printf("%s\n", recvbuf);
  61.     // 6.对响应包体进行JSON解析
  62.     // 1) 先把获取的字符串转换为JSON格式
  63.     cJSON *obj = cJSON_Parse(recvbuf);
  64.     // 2) 把解析之后的JSON格式进行输出,用于调试
  65.     printf("%s\n", cJSON_Print(obj));
  66.     // 3) 对JSON格式进行解析
  67.     cJSON *results = NULL;
  68.     results = cJSON_GetObjectItem(obj, "results");
  69.     printf("array size = %d\n", cJSON_GetArraySize(results));
  70.     // 4)对城市的实时温度数据进行解析
  71.     cJSON *result = NULL;
  72.     cJSON_ArrayForEach(result, results)
  73.     {
  74.     cJSON *now = cJSON_GetObjectItem(result, "now");
  75.     cJSON *temperature = cJSON_GetObjectItem(now, "temperature");
  76.     printf("temperature : %s\n", temperature->valuestring);
  77.     printf("temperature : %d\n", atoi(temperature->valuestring));
  78.     }
  79.     return 0;
  80. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册