当前位置:   article > 正文

鸿蒙源码分析(三)_json用于描述数据结构,包含以下哪些形式

json用于描述数据结构,包含以下哪些形式

鸿蒙JSON和cJSON语法以及message.c中相关的类型转获取

文件路径(模块一\communication_softbus_lite- master\trans_service\source\utils\message.c)

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

JSON用于描述数据结构,有以下形式存在:

(1) 对象(object): 一个对象以”{“开始,并以”}”结束。一个对象包含一系列非排序的名称/值对,每个名称/值对之间使用”,”分隔。

(2) 名称/值(collection): 名称和值之间使用”:”隔开。一个名称是一个字符串;一个值 (value)可以是双引号括起来的字符串(string)、数值(number)、true、false、null、对象(object)或者数组(array)。这些结构可以嵌套。

JSON语法规则:

(1)、数据在键值对中;
(2)、数据由逗号分隔;
(3)、花括号保存对象;
(4)、方括号保存数组。

JSON的值可以是:

(1)、数值: 一系列0–9的数字组合,可以为负数或者小数。还可以用”e”或者”E”表示为指数形式。数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
(2)、字符串: 以""括起来的一串字符。字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。字符串(string)与C或者Java的字符串非常相似。
(3)、布尔值: 表示为true或者false。
(4)、数组(Array): 数组是值(value)的有序集合。一个数组以”[“(左中括号)开始,”]”(右中括号)结束。值之间使用”,”(逗号)分隔。数组索引从0开始。
(5)、对象(object): 对象是一个无序的”名称/值”对集合。一个对象以”{“开始,并以”}”结束。每个”名称”后跟一个”:”(冒号)。”名称/值”对之间使用”,”(逗号)分隔。
(6)、null: 空白可以加入到任何符号之间

cJSON是一个仅有一个.h文件,一个.c文件组成的JSON解析器,它是由纯C(ANSI C89)实现的,跨平台性较好。cJSON中有一个cJSON结构体。cJSON是采用链表存储的。cJSON数据类型在鸿蒙的网页开发中扮演着重要的角色,本篇文章解释一下message.c文件中相关内容

代码标注部分

1.相关头文件cJSON.h

下面是cJSON定义的头文件cJSON.h内容,里面为cJSON数据类型和相关宏定义。
一个重要概念:
在cjson中,json对象可以是json,可以是字符串,可以是数字。
该结构体 cJSON的声明定义解析见下面cjson数据结构定义:

#define cJSON_False 0
#define cJSON_True 1
#define cJSON_NULL 2
#define cJSON_Number 3
#define cJSON_String 4
#define cJSON_Array 5
#define cJSON_Object 6

typedef struct cJSON {
    struct cJSON *next,*prev;    /* 之前和之后节点,方便前后调用 */
    struct cJSON *child;        /* 定义一个子节点 */
    int type;                    /* The type of the item, as above. cjson结构的类型上面宏定义的7中之一*/
    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;                /* 项的名称字符串,如果此项是对象的子项或在对象的子项列表中。*/
} cJSON;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

上面结构体中的数据类型定义使得JSON开发变得简单高效,本次标注所使用到的数据类型主要为string和valueint。

2.message.h 头文件

message.h 头文件里面声明了一部分函数,已经通过宏定义规定了一些操作的验证码。
相关代码注释见下方:

#ifndef __MESSAGE_H__
#define __MESSAGE_H__
//首先使用条件编译,防止多文件调用时候重复编译

#include "cJSON.h"
#define CODE_VERIFY_IP              1//IP验证码
#define CODE_VERIFY_DEVID           2//设备驱动验证码
#define CODE_VERIFY_P2P             3 //计算机分享网络技术:点对点
#define CODE_OPEN_AUTH_MSG_CHANNEL  4//打开用户消息通道码
#define CODE_OPEN_CHANNEL           1//打开通道代码

int GetJsonInt(const cJSON *root, const char *name, int *result);
char* GetJsonString(const cJSON *root, const char *name);
//两个相关函数的声明,函数详细解释于message.c文件
#endif

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

头文件中的相关操作码的宏定义没找到具体的引用位置。

3. message.c文件

这个头文件主要用来转换一些cJSON相关的数据类型,转换获得JSON数据中的指定数据类型int和string。
其中的函数使用"\communication_softbus_lite-master\authmanager\source\msg_get_deviceid.c"文件和wifi_auth_manager.c文件当中使用,用来转换判断一些数据类型并获得相关数据。
具体使用见上述文件分析:

#include "message.h"

int GetJsonInt(const cJSON *root, const char *name, int *result)
{
    if (root == NULL || name == NULL || result == NULL) {
        return -1;
        //传入的参数只要有空值,就返回-1
    }
    
    cJSON *item = cJSON_GetObjectItem(root, name);
    //调用cJSON_GetObjectItem()函数,可从cJSON结构体中查找某个子节点名称(键名称),如果查找成功可把该子节点序列化到cJSON结构体中。
    if ((item == NULL) || (!cJSON_IsNumber(item))) {
        //如果cJSON_GetObjectItem()函数执行失败,item则为NULL
        //cJSON_IsNumber(item)用来判断item指向的数据类型是否为数字
        //如果如果cJSON_GetObjectItem()函数执行失败或者item指向的数据类型不为数字,返回-1
        return -1;
    }
    
    *result = item->valueint;
    //执行成功并且item为数字,将result赋值item.valueint
    return 0;
}

char* GetJsonString(const cJSON *root, const char *name)
{
    if (root == NULL || name == NULL) {
        //传入的参数只要有空值,就返回空值
        return NULL;
    }
    
    cJSON *item = cJSON_GetObjectItem(root, name);
    //调用cJSON_GetObjectItem()函数,可从cJSON结构体中查找某个子节点名称(键名称),如果查找成功可把该子节点序列化到cJSON结构体中。
    if ((item == NULL) || (!cJSON_IsString(item))) {
        //如果如果cJSON_GetObjectItem()函数执行失败或者item指向的数据类型不为string,返回NULL
        return NULL;
    }
    
    return item->valuestring;
    //执行成功并且item指向string类型,返回item->valuestring
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

message.c文件用来获取JSON数据中的指定数据类型,其中有一定的数据类型转换实现。GetJsonInt函数中涉及到number类型判断, GetJsonString函数涉及到string类型判断,判断成功则成功获取对应数据。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/235438
推荐阅读
相关标签
  

闽ICP备14008679号