zoukankan      html  css  js  c++  java
  • cJSON库的简单介绍及使用

    转载:http://www.cnblogs.com/liunianshiwei/p/6087596.html

    JSON 语法是 JavaScript 对象表示法语法的子集。数据在键/值对中;数据由逗号分隔;花括号保存对象, 也称一个文档对象;方括号保存数组, 每个数组成员用逗号隔开, 并且每个数组成员可以是文档对象或者数组或者键值对 。

    JSON基于两种结构:
        “名称/值”对的集合(A collection of name/value pairs)。不同的编程语言中,它被理解为对象(object),纪录(record),结构(struct),字(dictionary),哈希表(hashtable),有键列表(keyed list),或者关联数组 (associative array)。
        值的有序列表(An ordered list of values)。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)。 

    JSON的三种语法: 

        键/值对 key:value,用半角冒号分割。 比如 "name":"Faye" 
        文档对象 JSON对象写在花括号中,可以包含多个键/值对。比如{ "name":"Faye" ,"address":"北京" }。 
        数组 JSON 数组在方括号中书写: 数组成员可以是对象,值,也可以是数组(只要有意义)。 {"love": ["乒乓球","高尔夫","斯诺克","羽毛球","LOL","撩妹"]} 

     附cJSON库下载地址 https://github.com/DaveGamble/cJSON 

    如何在自己的项目中使用cJSON:

          将cJSON.c(或者库文件和 cJSON.h添加到项目中即可;

    C语言函数库写JSON文件 :

        从缓冲区中解析出JSON结构:extern cJSON *cJSON_Parse(const char *value); 
        解析一块JSON数据返回cJSON结构, 在使用完之后调用cJSON_Delete函数释放json对象结构。

        将传入的JSON结构转化为字符串 :extern char *cJSON_Print(cJSON *item); 
        可用于输出到输出设备, 使用完之后free(char *) 。

        将JSON结构所占用的数据空间释放 :void cJSON_Delete(cJSON *c)

        创建一个值类型的数据 :extern cJSON *cJSON_CreateNumber(double num);
                    extern cJSON *cJSON_CreateString(const char *string);
                    extern cJSON *cJSON_CreateArray(void);

        创建一个对象(文档) :extern cJSON *cJSON_CreateObject(void);

        数组创建以及添加 :cJSON *cJSON_CreateIntArray(const int *numbers,int count);
                  void cJSON_AddItemToArray(cJSON *array, cJSON *item);

        JSON嵌套 :

              【 向对象中增加键值对】 cJSON_AddItemToObject(root, "rows", 值类型数据相关函数());
              【 向对象中增加数组】 cJSON_AddItemToObject(root, "rows", cJSON_CreateArray());
              【 向数组中增加对象】 cJSON_AddItemToArray(rows, cJSON_CreateObject());

        几个能提高操作效率的宏函数 :#define cJSON_AddNumberToObject(object,name,n)
                            cJSON_AddItemToObject(object, name,cJSON_CreateNumber(n))
                       #define cJSON_AddStringToObject(object,name,s)
                            cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) 

    C语言库函数解析JSON文件 :

        根据键找json结点 :extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string)

        判断是否有keystring的项 如果有返回否则返回0 :

    extern int cJSON_HasObjectItem(cJSON *object,const char *string)
                          { return cJSON_GetObjectItem(object,string)?1:0; }

        返回数组结点array中成员的个数 :extern int cJSON_GetArraySize(cJSON *array);

        根据数组下标indexarray数组结点的第index个成员 返回该成员节点 :extern cJSON *cJSON_GetArrayItem(cJSON *array,int index);

        遍历数组 :#define cJSON_ArrayForEach(pos, head)        for(pos = (head)->child; pos != NULL; pos = pos->next) 

    例子:

    1.解析json

    void CParsejson()
    {
        char* data = "{"name":"Messi","age":"29"}";
    //从缓冲区中解析json结构 cJSON
    * root = cJSON_Parse(data); if (data == NULL) { return; } cJSON* itemName = cJSON_GetObjectItem(root, "name"); if (itemName) { cout << "name: "<< itemName->valuestring << endl; } cJSON* itemAge = cJSON_GetObjectItem(root, "age"); if (itemAge) { cout << "age: " << itemAge->valuestring << endl; } //讲json结构占用的数据空间释放 cJSON_Delete(root); } int main() { CjsonTest1(); return 0; }

    运行结果:

    2.讲json数据写入文件

    void WriteJson()
    {
        char *char_json = "{"hello":"你好"}";
    
        //从缓冲区中解析出JSON结构
        cJSON *json = cJSON_Parse(char_json);
    
        if (json == NULL)
        {
            return;
        }
    
        //将传入的JSON结构转化为字符串 
        char *buf = NULL;
         buf = cJSON_Print(json);
    
        //打开一个info.json文件,并写入json内容
        FILE *fp = fopen("info.json", "w");
        fwrite(buf, strlen(buf), 1, fp);
    
        fclose(fp);//关闭文件
        free(buf);//释放资源
        cJSON_Delete(json);//释放资源
    }
    
    int main()
    {
      WriteJson();
      return 0;
    }

    文件内容:

    3.代码生成json

     

  • 相关阅读:
    2019 Multi-University Training Contest 3
    SDU暑期集训排位(2)
    2019牛客暑期多校训练营(第四场)
    2019牛客暑期多校训练营(第三场)
    2019 Multi-University Training Contest 2
    2019 Multi-University Training Contest 1
    hdu1158 Employment Planning(dp)
    hdu 1130How Many Trees?(卡特兰数)
    C++大整数类模板
    组合数模板
  • 原文地址:https://www.cnblogs.com/chechen/p/10002736.html
Copyright © 2011-2022 走看看