Linux CJSON库解析JSON数据示例:流量基线分析
Linux CJSON库解析JSON数据示例:流量基线分析
本文将介绍使用cJSON库解析JSON数据的示例代码,并以流量基线分析数据为例,展示如何提取和打印不同字段的值。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"
int main() {
// JSON字符串
char jsonStr[] = '{"data":{"CREATEDATE":"2023-08-25 10:57:31","COLLECT_IP":"198.168.200.40","COLLECT_NAME":"流量基线","DEVICE_IP":"198.168.200.40","DEVICE_TYPE":"网络交换机","DEVICE_NAME":"H3C","TARGET_IP":"192.168.10.11","TARGET_PORT":"1234","TARGET_HOSTNAME":"abc","SOURCE_IP":"192.168.10.23","SOURCE_PORT":"2232","SOURCE_HOSTNAME":"test","COLLECT_EVENT_TIME":"2023-08-25 18:41:07","EVENT_HAPPEN_TIME":"2023-08-25 18:41:07","EVENT_TYPE":"上行流量","EVENT_NAME":"上行流量","EVENT_CONTENT":"上行流量=0.098,超出基准下限0.9个单位"}}';
// 解析JSON
cJSON *root = cJSON_Parse(jsonStr);
if (root == NULL) {
printf("Failed to parse JSON: %s\n", cJSON_GetErrorPtr());
return 1;
}
// 获取data字段
cJSON *data = cJSON_GetObjectItem(root, "data");
if (data == NULL) {
printf("Failed to get data field\n");
cJSON_Delete(root);
return 1;
}
// 获取各个字段的值
char *createDate = cJSON_GetObjectItem(data, "CREATEDATE")->valuestring;
char *collectIP = cJSON_GetObjectItem(data, "COLLECT_IP")->valuestring;
char *collectName = cJSON_GetObjectItem(data, "COLLECT_NAME")->valuestring;
char *deviceIP = cJSON_GetObjectItem(data, "DEVICE_IP")->valuestring;
char *deviceType = cJSON_GetObjectItem(data, "DEVICE_TYPE")->valuestring;
char *deviceName = cJSON_GetObjectItem(data, "DEVICE_NAME")->valuestring;
char *targetIP = cJSON_GetObjectItem(data, "TARGET_IP")->valuestring;
char *targetPort = cJSON_GetObjectItem(data, "TARGET_PORT")->valuestring;
char *targetHostname = cJSON_GetObjectItem(data, "TARGET_HOSTNAME")->valuestring;
char *sourceIP = cJSON_GetObjectItem(data, "SOURCE_IP")->valuestring;
char *sourcePort = cJSON_GetObjectItem(data, "SOURCE_PORT")->valuestring;
char *sourceHostname = cJSON_GetObjectItem(data, "SOURCE_HOSTNAME")->valuestring;
char *collectEventTime = cJSON_GetObjectItem(data, "COLLECT_EVENT_TIME")->valuestring;
char *eventHappenTime = cJSON_GetObjectItem(data, "EVENT_HAPPEN_TIME")->valuestring;
char *eventType = cJSON_GetObjectItem(data, "EVENT_TYPE")->valuestring;
char *eventName = cJSON_GetObjectItem(data, "EVENT_NAME")->valuestring;
char *eventContent = cJSON_GetObjectItem(data, "EVENT_CONTENT")->valuestring;
// 打印各个字段的值
printf("CREATE DATE: %s\n", createDate);
printf("COLLECT IP: %s\n", collectIP);
printf("COLLECT NAME: %s\n", collectName);
printf("DEVICE IP: %s\n", deviceIP);
printf("DEVICE TYPE: %s\n", deviceType);
printf("DEVICE NAME: %s\n", deviceName);
printf("TARGET IP: %s\n", targetIP);
printf("TARGET PORT: %s\n", targetPort);
printf("TARGET HOSTNAME: %s\n", targetHostname);
printf("SOURCE IP: %s\n", sourceIP);
printf("SOURCE PORT: %s\n", sourcePort);
printf("SOURCE HOSTNAME: %s\n", sourceHostname);
printf("COLLECT EVENT TIME: %s\n", collectEventTime);
printf("EVENT HAPPEN TIME: %s\n", eventHappenTime);
printf("EVENT TYPE: %s\n", eventType);
printf("EVENT NAME: %s\n", eventName);
printf("EVENT CONTENT: %s\n", eventContent);
// 释放内存
cJSON_Delete(root);
return 0;
}
编译运行
在编译时需要链接cJSON库,可以使用gcc命令进行编译,例如:
gcc main.c cJSON.c -o main
请确保cJSON库的头文件和源文件与示例代码在同一个目录下,并将编译生成的可执行文件命名为main。
代码解释
- 包含头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"
首先,需要包含必要的头文件,包括标准输入输出库stdio.h、标准库函数stdlib.h、字符串操作库string.h和cJSON库头文件cJSON.h。
- 定义JSON字符串
char jsonStr[] = '{"data":{"CREATEDATE":"2023-08-25 10:57:31","COLLECT_IP":"198.168.200.40","COLLECT_NAME":"流量基线","DEVICE_IP":"198.168.200.40","DEVICE_TYPE":"网络交换机","DEVICE_NAME":"H3C","TARGET_IP":"192.168.10.11","TARGET_PORT":"1234","TARGET_HOSTNAME":"abc","SOURCE_IP":"192.168.10.23","SOURCE_PORT":"2232","SOURCE_HOSTNAME":"test","COLLECT_EVENT_TIME":"2023-08-25 18:41:07","EVENT_HAPPEN_TIME":"2023-08-25 18:41:07","EVENT_TYPE":"上行流量","EVENT_NAME":"上行流量","EVENT_CONTENT":"上行流量=0.098,超出基准下限0.9个单位"}}';
定义一个字符数组jsonStr,存储JSON字符串。在本例中,JSON数据包含了有关流量基线的信息,如采集时间、设备类型、目标IP等。
- 解析JSON数据
cJSON *root = cJSON_Parse(jsonStr);
使用cJSON_Parse()函数解析JSON字符串,并将其转换为cJSON数据结构。如果解析失败,函数将返回NULL,可以通过cJSON_GetErrorPtr()获取错误信息。
- 获取字段的值
char *createDate = cJSON_GetObjectItem(data, "CREATEDATE")->valuestring;
使用cJSON_GetObjectItem()函数从data对象中获取指定的字段值,并使用->valuestring访问字段的值。例如,cJSON_GetObjectItem(data, "CREATEDATE")获取data对象中的CREATEDATE字段,->valuestring获取该字段的字符串值。
- 打印字段的值
printf("CREATE DATE: %s\n", createDate);
使用printf()函数打印获取的字段值。
- 释放内存
cJSON_Delete(root);
最后,使用cJSON_Delete()函数释放cJSON数据结构占用的内存。
总结
本文介绍了使用cJSON库解析JSON数据的示例代码,并以流量基线分析数据为例,展示了如何提取和打印不同字段的值。cJSON库提供了丰富的函数,可以轻松地解析和操作JSON数据,并适用于各种场景,例如数据处理、网络通信等。
原文地址: https://www.cveoy.top/t/topic/qFIG 著作权归作者所有。请勿转载和采集!