zoukankan      html  css  js  c++  java
  • cJSON学习笔记

    1.JSON格式简述

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。(来自“开源中国”资料)
    cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。
    接触yeelink平台之后,慢慢接触到JSON格式,虽然一些简单的情况可以通过string库函数解析和组装JSON数据包,但是若有cJSON库的帮助,解析和组装JSON数据包的工作便会变得简单的多,下面就从两个例子出发说明cJSON数据包的使用方法。
        【相关博文】

    2.JSON结构体

    熟悉使用cJSON库函数可从cJSON结构体入手,cJSON结构体如下所示:
    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. typedef struct cJSON {  
    2.  struct cJSON *next,*prev;   
    3.  struct cJSON *child;   
    4.  int type;   
    5.  char *valuestring;   
    6.  int valueint;  
    7.  double valuedouble;   
    8.  char *string;   
    9. } cJSON;  

    几点说明

    1.cJOSN结构体为一个双向列表,并可通过child指针访问下一层。
    2.type变量决定数据项类型(键的类型),数据项可以是字符串可以是整形,也可以是浮点型。如果是整形值的话可从valueint,如果是浮点型的话可从valuedouble取出,以此类推。
    3.string可理解为节点的名称,综合此处的第2点可理解为“键”的名称。
     

    3.解析JSON数据包

    例如在yeelink平台中读取一个开关量的结果,向yeelink平台请求之后可以获得以下JSON数据包:
    {"timestamp":"2013-11-19T08:50:11","value":1}
    在这个JSON数据包中有两个数据项(键值对),一个是时间戳,该时间戳为字符串形式;另一个是开关值,该开关值为整型。该例子主要用于模拟向yeelink平台请求开关量数据。

    参考代码

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include "cJSON.h"
     4 // 被解析的JSON数据包
     5 char text[] = "{"timestamp":"2013-11-19T08:50:11","value":1}";
     6 int main (int argc, const char * argv[])
     7 {
     8     cJSON *json , *json_value , *json_timestamp;
     9     // 解析数据包
    10     json = cJSON_Parse(text);
    11     if (!json)
    12     {
    13         printf("Error before: [%s]
    ",cJSON_GetErrorPtr());
    14     }
    15     else
    16     {
    17         // 解析开关值
    18         json_value = cJSON_GetObjectItem( json , "value");
    19         if( json_value->type == cJSON_Number )
    20         {
    21             // 从valueint中获得结果
    22             printf("value:%d
    ",json_value->valueint);
    23         }
    24         // 解析时间戳
    25         json_timestamp = cJSON_GetObjectItem( json , "timestamp");
    26         if( json_timestamp->type == cJSON_String )
    27         {
    28             // valuestring中获得结果
    29             printf("%s
    ",json_timestamp->valuestring);
    30         }
    31         // 释放内存空间
    32         cJSON_Delete(json);
    33     }
    34     return 0;
    35 }

    运行结果

    value:1
    2013-11-19T08:50:11
     

    若干说明

    1.cJSON_Parse函数负责解析JSON数据包,并按照cJSON结构体的结构序列化整个数据包。使用该函数会通过malloc函数在内存中开辟一个空间,使用完成需要手动释放。
    2.cJSON_GetObjectItem函数可从cJSON结构体中查找某个子节点名称(键名称),如果查找成功可把该子节点序列化到cJSON结构体中。
    3.如果需要使用cJSON结构体中的内容,可通过cJSON结构体中的valueint和valuestring取出有价值的内容(即键的值)
    4.可通过cJSON_Delete释放内存空间。
     

    4.组装JSON数据包

    组装数据包的过程和解析数据包的过程相反,下面的例子描述如何组装以下数据包,该数据包只有一个数据项(键值对)。该例子主要用于模拟向yeelink平台上传传感器数据。
    {
     "value": 123.400000
    }
     

    参考代码

    #include <stdio.h>
    #include <stdlib.h>
    #include "cJSON.h"
    int main (int argc, const char * argv[])
    {
        // 创建JSON Object
        cJSON *root = cJSON_CreateObject();
        // 加入节点(键值对),节点名称为value,节点值为123.4
        cJSON_AddNumberToObject(root,"value",123.4);
        // 打印JSON数据包
        char *out = cJSON_Print(root);
        printf("%s
    ",out);
        // 释放内存
        cJSON_Delete(root);
        free(out);
        return 0;
    }
    

      

     

    若干说明

    1. cJSON_CreateObject函数可创建一个根数据项,之后便可向该根数据项中添加string或int等内容
    2. cJSON_AddNumberToObject向节点中添加子节点,例如此处添加value节点,节点值为123.4
    3. cJSON_Print函数可以打印根数据项,加入制表符换行符等标识符使得JSON数据包更易阅读
    4. 使用free函数释放被out占用的内存空间
     

    5.总结

    整体来说cJSON简单易用,解决了JSON数据包解析和组装的问题,向着心中的目标更近一步了。
     

    6.参考资料

    版权声明:本文为博主转载文章,原文地址,只为方便学习,谢谢博主。

  • 相关阅读:
    LeetCode Single Number
    Leetcode Populating Next Right Pointers in Each Node
    LeetCode Permutations
    Leetcode Sum Root to Leaf Numbers
    LeetCode Candy
    LeetCode Sort List
    LeetCode Remove Duplicates from Sorted List II
    LeetCode Remove Duplicates from Sorted List
    spring MVC HandlerInterceptorAdapter
    yum
  • 原文地址:https://www.cnblogs.com/skl374199080/p/4961512.html
Copyright © 2011-2022 走看看