二. 基础数据结构

xlqblog / 2023-07-17 / 原文

二. 基础数据结构

0. 引

JSON是一个有着特殊结构的数据, 为了解析JSON, 需要使用编程语言将JSON的数据格式进行抽象, 有助于更好地, 快捷地实现JSON数据的解析.

为了使解析JSON结构的性能更好, 选用C语言实现JSON的数据结构的抽象, 以及底层的结构的解析功能实现.

1. JSON基础数据结构

JSON数据的类型只能为JSON标准所规定的五种类型:( JSON的基本数据类型)

  • 2. JSON的基本数据类型

    1. 数值: 十进制数, 不能有前导0, 可以为负数, 可以有小数部分. 还可以用e​或者E​表示指数部分. 不能包含非数, 如NaN. 不区分整数与浮点数.
    2. 字符串: 以双引号" "​括起来的零个或者多个​, 支持以反斜杠开始的转义字符序列.
    3. 布尔值: 表示为true​或者false
    4. 数组: 有序的零个或者多个值. 每个值可以为任意类型. 数组使用方括号包裹. 多个数组元素之间用逗号分隔.
    5. 对象: 若干无序的"键-值对", 其中键只能是字符串. 建议但不强制要求对象中的键是独一无二的. 对象以花括号{}​包裹. 多个键-值对之间使用逗号,​分隔. 键与值之间使用冒号:​分隔.
    6. 空值: 值写为null

1.1 JSON数据的抽象(json_value_t)

从最开始, 我们需要一个数据结构, 这个结构可以表示所有合法类型的JSON数据.

这个结构应该有以下成员:

  1. 数据的类型(type), 用于表示当前数据的类型, 由于json数据支持的类型只有6种, 所以这个成员使用int便可以存储
  2. 数据的值(value), 类型暂未知, 暂用TYPE​表示.
  • 进行抽象, 得到以下代码:

    typedef struct __json_value json_value_t
    
    struct __json_value
    {
        int type;
        TYPE value;
    };
    

    对于type​, 所有的类型可能都已知, 其中bool​类型的true​和false​可作为单独的类型表示, 即总共存在7种类型, 可使用C语言宏进行表示.

    对于value​, 最直觉的方式是可以使用一个结构体进行存储, 结构体中包含type​对应的value​, 而每一个特定的json​数据, 其type​和value​已经固定, 故可以使用union​进行表示.

    更近一步的, 对于null​类型和bool​类型中的true​和false​类型, 由于这三种类型的所对应的值只有一种固定的表示, 故可以直接使用type来表示其值.

    现在需要表示的value剩下: number​, string​, array​, object

    其中, number​和string​可直接使用C语言内置类型double​和char *​进行表示, array​和object​作为复合类型, 使用另一个自定义的结构体进行定义, 该结构体命名上为了和__json_value​保持一致, 使用json_array_t​和json_object_t​表示, 其具体实现, 后面展开.

  • 综合上面的分析, 可以得到json数据的抽象结构如下

    #define JSON_VALUE_STRING	1
    #define JSON_VALUE_NUMBER	2
    #define JSON_VALUE_OBJECT	3
    #define JSON_VALUE_ARRAY	4
    #define JSON_VALUE_TRUE		5
    #define JSON_VALUE_FALSE	6
    #define JSON_VALUE_NULL		7
    
    typedef struct __json_value json_value_t;
    
    struct __json_value
    {
        int type;
        union
        {
            char *string;
            double number;
        	json_object_t object;
    	json_array_t array;
        } value;
    };
    

参考

[1] Workflow 源码解析 Json parser :part1 parse - 知乎 (zhihu.com)

[2] 维基百科(JSON)