二. 基础数据结构
0. 引
JSON是一个有着特殊结构的数据, 为了解析JSON, 需要使用编程语言将JSON的数据格式进行抽象, 有助于更好地, 快捷地实现JSON数据的解析.
为了使解析JSON结构的性能更好, 选用C语言实现JSON的数据结构的抽象, 以及底层的结构的解析功能实现.
1. JSON基础数据结构
JSON数据的类型只能为JSON标准所规定的五种类型:( JSON的基本数据类型)
-
2. JSON的基本数据类型
- 数值: 十进制数, 不能有前导0, 可以为负数, 可以有小数部分. 还可以用
e
或者E
表示指数部分. 不能包含非数, 如NaN. 不区分整数与浮点数. - 字符串: 以双引号
" "
括起来的零个或者多个
, 支持以反斜杠开始的转义字符序列. - 布尔值: 表示为
true
或者false
- 数组: 有序的零个或者多个值. 每个值可以为任意类型. 数组使用方括号包裹. 多个数组元素之间用逗号分隔.
- 对象: 若干无序的"键-值对", 其中键只能是字符串. 建议但不强制要求对象中的键是独一无二的. 对象以花括号
{}
包裹. 多个键-值对之间使用逗号,
分隔. 键与值之间使用冒号:
分隔. - 空值: 值写为
null
- 数值: 十进制数, 不能有前导0, 可以为负数, 可以有小数部分. 还可以用
1.1 JSON数据的抽象(json_value_t)
从最开始, 我们需要一个数据结构, 这个结构可以表示所有合法类型的JSON数据.
这个结构应该有以下成员:
- 数据的类型(type), 用于表示当前数据的类型, 由于json数据支持的类型只有6种, 所以这个成员使用int便可以存储
- 数据的值(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)
标签:基础,json,value,JSON,VALUE,类型,数据结构,type From: https://www.cnblogs.com/xlqblog/p/basic-data-structure-26s9tn.html