首页 > 其他分享 >二. 基础数据结构

二. 基础数据结构

时间:2023-07-16 23:46:58浏览次数:38  
标签:基础 json value JSON VALUE 类型 数据结构 type

二. 基础数据结构

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)

标签:基础,json,value,JSON,VALUE,类型,数据结构,type
From: https://www.cnblogs.com/xlqblog/p/basic-data-structure-26s9tn.html

相关文章

  • 【技术积累】JavaScript中的基础语法【二】
    JavaScript编写方式JavaScript是一种脚本语言,用于为网页添加交互性和动态功能。它可以直接嵌入到HTML中,并通过浏览器解释执行。下面是一些常见的JavaScript编写方式和相应的代码示例:内联方式在HTML文件中直接嵌入JavaScript代码,使用`<script>`标签将代码包裹起来。这种方式适用......
  • C语言基础总结
    C语言基础单独讲的C语言。目前与安卓、Java毫无关系。1.1编译器在你自己电脑上安装相关语言的编译器:VisualC++、GCCmac,默认clang(mac用户自带C编译器),如果没有就去直接安装xcode。 xcode:https://developer.apple.com/xcode/win,MinGV https://www.cnblogs.com/longxiny......
  • 计算机系统基础PA0
    实验前的阅读传自远古时代的OS实验课程网站中的Linux入门教程     一个有意思的问题想要回答这个问题就要知道什么是manpage不妨manman  看来,当我们执行manxxx时,给出的是xxx的参考文档 能被man识别到的xxx有以下几类: ......
  • 复习-基础课-基础算法
    1.快速排序:不稳定,其他略。2.归并排序:稳定,常用于求逆序对。voidmsort(intl,intr){if(l>=r)return;intmid=(l+r)>>1;msort(l,mid);msort(mid+1,r);//递归排序intk=0;inti=l,j=mid+1;while(i<=mid&&j<=......
  • 数据结构练习笔记——创建有序单链表
    创建有序单链表【问题描述】为从键盘终端输入的m个整数创建带头结点的有序单链表存储结构,使输入的数据元素在单链表中按照元素值递增有序。【输入形式】第一行:单链表中元素个数m第二行:单链表中的m个整数【输出形式】按递增有序形式输出m个整数【样例输入】513245【......
  • CTO网络工程师:进制转换基础
    十进制:计数符号0到9  基数10计数规则逢十进一表示方法:101或(101)10 八进制计数符号0到7基数8计数规则逢八进一   二进制计数符号0到1基数2计数规则逢二进一  十六进制 基数16计数规则逢十六进一表示方法    ......
  • 【技术积累】JavaScript中的基础语法【一】
    Math对象JavaScript中的Math对象是一个内置的数学对象,表示对数字进行数学运算的方法和属性的集合。Math对象不是一个构造函数,所以不能使用new关键字来创建一个Math对象的实例。它包含了一些常见的数学运算函数和常量,可以直接通过Math对象来调用。以下是Math对象的一些常用方法:......
  • 网络编程 p1 网络基础
    网络基础网络通信概念:两台设备之间通过网络实现数据传输;网络通信:将数据通过网络从一台设备传输到另一台设备;java.net包下提供了一系列的类或接口,供程序员使用,完成网络通信;网络概念:两台或多台设备通过一定物理设备连接起来构成了网络;根据网络的覆盖范围不同,对网络进行分......
  • 消息队列基础
    消息队列本质是将同步处理转成异步处理消息队列的基本要求不丢消息高可用高性能消息队列名称RabbitMQRocketMQKafka优点轻量级低延迟和高稳定性1. 与周边生态系统的兼容性最好2. 基于异步批量设计的异步收发性能最好缺点1. 消息大量堆积......
  • C语言:数据结构之单链表(四)
    本篇谈一谈单链表的改,具体操作就是找到他,然后修改元素即可,上一篇有相关代码,可以参考。改函数代码如下:voidCorrect(LinkListheader,intsite_,charletter_){LinkListq=Search_Site(header,site_);q->letter=letter_;}main函数如下:(修改第6,......