智能硬件数据传输之CJSON转化

2017-09-22  本文已影响0人  creker

来点儿干货,今天白天主要时间都在车上,于是继续完善这篇文章。

原本以为在写上一条引用的时候可以把这篇完成,结果中途又遇到了一些问题,自己对JSON的语法规则并没有很理解,这是停留在应用层面。于是,在业余时间,挤了挤时间,看了一些JSON的语法知识。

前言

1 概述

2 JSON

{
    "msg": [
        {
            "ctime": "20170916091927",
            "gateLine": "ON",
            "locksId": 65,
            "isLocked": true,
            "locksNo": "1001001105",
            "pwd": {
                "1": "654321",
                "2": "147258"
            }
        },
        {
            "ctime": "20170916091927",
            "gateLine": "ON",
            "locksId": 66,
            "isLocked": false,
            "locksNo": "1001001106",
            "pwd": {
                "1": "123456",
                "2": “147258"
            }
        }
    ],
    "code": 0
}

2.1JSON 语法规则

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。

  1. 结构特点
  1. 说明一下:键、值可层层嵌套

2.2 JSON值

2.2.3 JSON数字

"locksId": 65,

2.2.4 JSON字符串

"ctime": "20170916091927",

2.2.5 JSON逻辑值

"isLocked": false,

2.2.6 JSON数组

    "msg": [
        {
            "ctime": "20170916091927",
            "gateLine": "ON",
            "locksId": 65,
            "isLocked": true,
            "locksNo": "1001001105",
            "pwd": {
                "1": "654321",
                "2": "147258"
            }
        },
        {
            "ctime": "20170916091927",
            "gateLine": "ON",
            "locksId": 66,
            "isLocked": false,
            "locksNo": "1001001106",
            "pwd": {
                "1": "123456",
                "2": “147258"
            }
        }
    ],

2.2.7 JSON对象

        {
            "ctime": "20170916091927",
            "gateLine": "ON",
            "locksId": 66,
            "isLocked": false,
            "locksNo": "1001001106",
            "pwd": {
                "1": "123456",
                "2": “147258"
            }
        }

看到,应该可以深入感受一下上文提到的"键、值可层层嵌套"

2.2.8 介绍一下JSON数据格式

笔者需要补充一下json的数据格式,学习中。。。。。。

3 介绍CJOSN的结构

/* The cJSON structure: */
typedef struct cJSON {
    struct cJSON *next,*prev;   /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
    struct cJSON *child;        /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */

    int type;                   /* The type of the item, as above. */

    char *valuestring;          /* The item's string, if type==cJSON_String */
    int valueint;               /* The item's number, if type==cJSON_Number */
    double valuedouble;         /* The item's number, if type==cJSON_Number */

    char *string;               /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
} cJSON;

这个结构体包含了所有的返回数据类型。

4 介绍CJSON的解析

4.1 解析使用的核心函数如下

 cJSON *cJSON_Parse(const char *value);
 void   cJSON_Delete(cJSON *c);
 int      cJSON_GetArraySize(cJSON *array);
 cJSON *cJSON_GetArrayItem(cJSON *array,int item);
 cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
  1. 一共五个函数, 前三个函数使用的位置和方法都很固定,后两个就是在获取数据的时候反复调用,目的就是走到JSON数据的最底部--获取健值。
  2. 总结一下就是:三个函数固定使用,目的是获取待处理的数据或者做收尾工作;两个函数反复使用,目的是一层一层往下,获取到基本数据。
 cJSON *cJSON_Parse(const char *value);
 void   cJSON_Delete(cJSON *c);
 int      cJSON_GetArraySize(cJSON *array);
  1. 下面是两个最重要的函数,熟练掌握了这两个函数,大多数的场景都可以应对了。
 cJSON *cJSON_GetArrayItem(cJSON *array,int item);
cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);

4.2 解析举例说明

4.2.1数据分析

{
    "msg": [
        {
            "ctime": "20170916091927",
            "gateLine": "ON",
            "locksId": 65,
            "isLocked": true,
            "locksNo": "1001001105",
            "pwd": {
                "1": "654321",
                "2": "147258"
            }
        },
        {
            "ctime": "20170916091927",
            "gateLine": "ON",
            "locksId": 66,
            "isLocked": false,
            "locksNo": "1001001106",
            "pwd": {
                "1": "123456",
                "2": “147258"
            }
        }
    ],
    "code": 0
}
  1. 最外围结构为一个对象(花括号)。使用cJSON_Parse就可以获取到JSON对象内容
  2. 对象当中包含了两个Item,分别是"msg"和"code"。
  3. "code"对应的是一个数字,一次解析可以获得数据。使用cJSON_GetObjectItem,获取返回的int类型数据
  4. "msg"里面包含了一个JSON数组,每个数组的元素为一个对象。使用cJSON_GetObjectItem,返回值是一个array
  5. 先获取到array的数量。使用cJSON_GetArraySize
  6. 用for循环对每个数组里面的对象元素做解析cJSON_GetArrayItem,返回一个对象
  7. 反复对对象做解析,就可以获取所有的数据。反复使用cJSON_GetObjectItem

4.2.2 贴一小段代码示例

步骤1
    Mother_obj=cJSON_Parse(json_string);
                                                //json_string为源数据的字符数组
                                                //Mother_obj为整个花括号对应的对象
步骤2,3
    arry_obj_item = cJSON_GetObjectItem(Mother_obj,"code");
    json_int_buf=arry_obj_item->valueint;
                                                //获取code的值
步骤4
    array = cJSON_GetObjectItem(Mother_obj,"msg");
                                                //获取“msg”的数组值
步骤5
lock_array_len = cJSON_GetArraySize(array);
                                                //获取数组里面的元素个数
步骤6,7
        for(i=0;i<lock_array_len;i++){

            array_obj = cJSON_GetArrayItem(array,i);
                                                //获取数组里面的元素对象
//后面就对对象做处理,反复调用cJSON_GetObjectItem即可
            if(array_obj==NULL)continue;
//获取“time”对应的值
            arry_obj_item = cJSON_GetObjectItem(array_obj,"ctime");
            if(arry_obj_item==NULL)continue;
            json_buf = arry_obj_item->valuestring;
//获取“lockId”对应的值
            arry_obj_item = cJSON_GetObjectItem(array_obj,"locksId");
            if(arry_obj_item==NULL)continue;
            json_int_buf = arry_obj_item->valueint;
        }   

按照层层嵌套的逻辑,就可以解析出整个字符串

5 介绍CJSON的数据组合

CrekerLi,与君共勉于技术之路上

上一篇 下一篇

猜你喜欢

热点阅读