zoukankan      html  css  js  c++  java
  • cJSON使用

    cJSON是使用C语言编写的   关于JSON数据的   编解码库,使用方便简单

    编译时注意后面要跟-lm参数,否则编译会报错

    解析JSON数据包流程:

    1.调用cJSON_Parse()函数,解析JSON数据包,并按照cJSON结构体的结构序列化整个数据包。使用该函数会通过malloc()函数在内存中开辟一个空间,使用完成需要手动释放

    cJSON *cJSON_Parse(const char *value)

    2. 调用cJSON_GetObjectItem()函数,可从cJSON结构体中查找某个子节点名称(键名称),如果查找成功可把该子节点序列化到cJSON结构体中。

    cJSON *cJSON_GetObjectItem(cJSON *object,const char *string)

    3.如果需要使用cJSON结构体中的内容,可通过cJSON结构体中的valueint和valuestring取出有价值的内容(即键的值)

    4.  通过cJSON_Delete(),释放cJSON_Parse()分配出来的内存空间

    void cJSON_Delete(cJSON *c)

    下面是一个简单的解析函数例子:

    void parseJson(char* pMsg)
    {
    
        cJSON* jsonRoot = cJSON_Parse(pMsg);//转化为JSON结构体,再进行解释
        
        //注释部分格式化打印json数据
        // char* out = cJSON_Print(jsonRoot);
        // printf("%s
    ",out);
        // free(out);
    
        cJSON* item = cJSON_GetObjectItem(jsonRoot,"flvpath");//获取键名为"flvpath"的值
        printf("
    flvpath type:%d,value:%s
    ",item->type,item->valuestring);
    
        cJSON_Delete(jsonRoot);
    }

     稍微复杂一点的:

    /*
    jsondata={"cmd":"meetingmemberlist","memberinfos":[{"name":"","number":"668162", "status":"Offline"},{"name":"66668888","status":"Offline"}, {"name":"1.221","number":"1234561","status":"Offline"},{"name":"1.42","status":"Offline"}], "session":"253398743ll","touid":"19","xns":"18"} */ void ConferenceControlView::get_memberdata_from_jsondate(std::string jsondata) { cJSON* jsonRoot = cJSON_Parse(jsondata.c_str());//转化为JSON结构体,再进行解释 if(NULL == jsonRoot) return; #if 0 //注释部分格式化打印json数据 char* out = cJSON_Print(jsonRoot); qDebug() << out; free(out); #endif //获取键名为"memberinfos"的值 cJSON* item = cJSON_GetObjectItem(jsonRoot,"memberinfos"); if(NULL == item) return; int size = cJSON_GetArraySize(item); DebugLog( << "size = " << size); if(0 == size) return; cJSON *arr = item->child; cJSON* item_chile = NULL; for(int i = 0;i < size;++i) { if(item_chile = cJSON_GetObjectItem(arr,"name")){ qDebug() << item_chile->valuestring; } if(item_chile = cJSON_GetObjectItem(arr,"number")){ qDebug() << item_chile->valuestring; } if(item_chile = cJSON_GetObjectItem(arr,"status")){ qDebug() << item_chile->valuestring << " "; } arr = arr->next; } cJSON_Delete(jsonRoot); }

    下面是一段创建JSON数据代码:

    #include<stdio.h> 
    #include<stdlib.h> 
    #include<string.h> 
    #include"cJSON.h"
    
    int main() 
    { 
        cJSON * usr;
    
        usr=cJSON_CreateObject(); //创建根数据对象 
        cJSON_AddStringToObject(usr,"name","fengxin"); //加入键值,加字符串 
        cJSON_AddStringToObject(usr,"passwd","123"); 
        cJSON_AddNumberToObject(usr,"num",1); //加整数
    
        char *out = cJSON_PrintUnformatted(usr); //将json转为字符串形式 
        char *out1 = cJSON_Print(usr); //将json转为好看的字符串形式 
    
        cJSON_Delete(usr); // 释放内存  
    
        printf("%s
    ",out); 
        printf("%s
    ",out1);
    
        free(out);// 释放内存
        free(out1);// 释放内存
    
    }

    结合 cJSON.c一起编译即可运行

    编译gcc -o test   *.c   -lm

    注意后面要跟-lm参数,否则编译会报错

    结果如下:

  • 相关阅读:
    python类内置方法之__call__
    selenium之python源码解读-webdriver继承关系
    Jmeter之JDBC类型组件
    Jmeter逻辑控制之if控制器
    Java连接MySQL Warning: Establishing SSL connection without server's identity verification is not recommended
    Python3 Windows服务器简单实现 手机访问
    如何在C语言 C++里面调用 DOS命令
    常用DOS命令(1) color,dir,copy,shutdown,mkdir(md),rmdir(rd),attrib,cd
    Java实现队列
    Java 实现 栈
  • 原文地址:https://www.cnblogs.com/nanqiang/p/6735025.html
Copyright © 2011-2022 走看看