栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C库Json解析

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C库Json解析

文章目录
  • 前言
  • 1. c++库libjsoncpp使用
  • 2. C解析,参考前言2中,在此只做备份,避免原链接失效。

前言
  1. c++的json库参照行李转盘中的fcgidemo,项目中给出一个静态库libjsoncpp.a,目前暂无源码,如果需要,网站拿源码;
  2. c语言的库提供了源码,参照青果项目中的cJSON.c和cJSON.h即可(确认直接编译通过),另外可以参照如下链接: C语言cJSON库的使用,解析json数据格式

1. c++库libjsoncpp使用

链接:C++库libjsoncpp使用

2. C解析,参考前言2中,在此只做备份,避免原链接失效。

对于c语言来说是没有字典这样的结构的,所以对于解析json格式的数据来说不是那么好解析,但是有些时候又会需要处理这样的数据格式,这里就有一个解析json的函数库可以给我们使用了。这个函数库就是cJSON了。这里提供了下载资源可以下载后直接用。链接: link

自己使用时可以只需要其中的cJSON.c和cJSON.h文件就可以了,只需要将cJSON和自己的main文件一起编译即可。
  主要函数接口介绍:
  这里有个很重要的结构体是需要用到的就是cJSON 结构体如下:

  typedef struct cJSON {
  struct cJSON *next,*prev;      
  struct cJSON *child;                   
   int type;                                     
  char *valuestring;                       
  int valueint;                                
  double valuedouble;                    
   char *string;                               
} cJSON;

说明:
1)cJSON是使用链表来存储数据的,其访问方式很像一颗树。每一个节点可以有兄弟节点,通过next/prev指针来查找,它类似双向链表;每个节点也可以有孩子节点,通过child指针来访问,进入下一层。只有节点是对象或数组时才可以有孩子节点。

2)type是键(key)的类型,一共有7种取值,分别是:False,Ture,NULL,Number,String,Array,Object。
若是Number类型,则valueint或valuedouble中存储着值。若期望的是int,则访问valueint,若期望的是double,则访问valuedouble,可以得到值。
若是String类型的,则valuestring中存储着值,可以访问valuestring得到值。

3)string中存放的是这个节点的名字,可理解为key的名称。重要的接口函数:
3-1)cJSON *cJSON_Parse(const char *value);
解析JSON数据包,并按照cJSON结构体的结构序列化整个数据包。可以看做是获取一个句柄。
3-2)cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
功能:获取json指定的对象成员
参数:*objec:第一个函数中获取的句柄。
string:需要获取的对象
返回值:这个对象成员的句柄 如果json格式的对象成员直接就是字符串那么就可以直接通过结构体中的valuestring元素来获取这个成员的值
3-3)cJSON *cJSON_GetArrayItem(cJSON *array,int item);
功能:有可能第二个函数中获取到的是成员对象值是一个数组,那么就需要用到这个函数。用来获取这个数组指定的下标对象
参数:*array:传入第二步中返回的值
    item:想要获取这个数组的下标元素
返回值:这个数组中指定下标的对象。然后在对这个返回值重复使用第二步函数就可以获取到各个成员的值了。
也就是说对象是数组的比是字符串的要多用一个cJSON_GetArrayItem函数,其他的没区别。

4)cJSON_Delete()
用来释放你第一步获取的句柄,来释放整个内存。用在解析完后调用。

用于解析的json结构,这里我使用配置文件保存的json结构,然后解析这个配置文件。用于测试json结构如下:
{"syslog_db":[{"db_user":"xxx","db_password":"yyy","db_type":"ORACLE","db_ip":"172.16.1.248","db_port":"1521","db_name":"orcl","sql":"select * from syslog"}],
"syslog_source":[{"send_ip":"172.0.0.8","send_port":"8","send_protocal":"TCP"}],
"syslog_enable":"1"
}

#include 
#include "cJSON.h"


int main() {
    FILE            *fp = NULL;
    cJSON           *json;
    char            *out;
    char            line[1024] = {0};


    if(NULL != (fp = fopen("./test.ply", "r"))) {
        while (NULL != fgets(line, sizeof(line), fp)) {
            json=cJSON_Parse(line); //获取整个大的句柄
            out=cJSON_Print(json);  //这个是可以输出的。为获取的整个json的值
            cJSON *arrayItem = cJSON_GetObjectItem(json,"syslog_db"); //获取这个对象成员
            cJSON *object = cJSON_GetArrayItem(arrayItem,0);   //因为这个对象是个数组获取,且只有一个元素所以写下标为0获取
            
        
            cJSON *item = cJSON_GetObjectItem(object,"db_user");  //
            printf("db_user:%sn",item->valuestring);


            item = cJSON_GetObjectItem(object,"db_password");
            printf("db_password:%sn",item->valuestring);


            item = cJSON_GetObjectItem(object,"db_type");
            printf("db_type:%sn",item->valuestring);


            item = cJSON_GetObjectItem(object,"db_ip");
            printf("db_ip:%sn",item->valuestring);


            item = cJSON_GetObjectItem(object,"db_port");
            printf("db_port:%sn",item->valuestring);


            item = cJSON_GetObjectItem(object,"db_name");
            printf("db_name:%sn",item->valuestring);


            item = cJSON_GetObjectItem(object,"sql");
            printf("db_sql:%sn",item->valuestring);
        //----------------------------------------------------


       
            arrayItem = cJSON_GetObjectItem(json,"syslog_enable");
            printf("%sn",arrayItem->valuestring);
        }
    }
        cJSON_Delete(json);
    close(fp);
}

字符串 {"id":1,"jsonrpc":"2.0","method":"getuserinfo","params":{"username":"admin","userpassword":"123456"},"result":"0"}
json = cJSON_Parse(pr);
cJSON *obj = cJSON_GetObjectItem(json,"params");
cJSON *obj1= cJSON_GetObjectItem(obj,"username");//对象中有对象
printf("%sn", obj1->valuestring);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928958.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号