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

代码解释

  1. 包含头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"

首先,需要包含必要的头文件,包括标准输入输出库stdio.h、标准库函数stdlib.h、字符串操作库string.h和cJSON库头文件cJSON.h

  1. 定义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等。

  1. 解析JSON数据
cJSON *root = cJSON_Parse(jsonStr);

使用cJSON_Parse()函数解析JSON字符串,并将其转换为cJSON数据结构。如果解析失败,函数将返回NULL,可以通过cJSON_GetErrorPtr()获取错误信息。

  1. 获取字段的值
char *createDate = cJSON_GetObjectItem(data, "CREATEDATE")->valuestring;

使用cJSON_GetObjectItem()函数从data对象中获取指定的字段值,并使用->valuestring访问字段的值。例如,cJSON_GetObjectItem(data, "CREATEDATE")获取data对象中的CREATEDATE字段,->valuestring获取该字段的字符串值。

  1. 打印字段的值
printf("CREATE DATE: %s\n", createDate);

使用printf()函数打印获取的字段值。

  1. 释放内存
cJSON_Delete(root);

最后,使用cJSON_Delete()函数释放cJSON数据结构占用的内存。

总结

本文介绍了使用cJSON库解析JSON数据的示例代码,并以流量基线分析数据为例,展示了如何提取和打印不同字段的值。cJSON库提供了丰富的函数,可以轻松地解析和操作JSON数据,并适用于各种场景,例如数据处理、网络通信等。


原文地址: https://www.cveoy.top/t/topic/qFIG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录