
DiaX的轮子工坊
业内流传着一句话叫“不要重复造轮子”,意思是不要重复开发已有的组件。这句话是针对实际工作的,然而在学习的过程中,我们的确有必要把轮子拆开看看它的内部构造,甚至可以尝试“重复造轮子”来锻炼自己。本专栏记录了我制造各种轮子的过程,分享出来以便学习交流。
DiaX
NEU软院大水逼一枚
展开
-
用C#实现一个Json解析器(6)——自定义键名映射
目录前言KeyAttribute特性高级语法分析器类改动前言本次我们实现自定义键名映射功能,用户可以指定C#对象的属性和哪个Json键值对构成映射。注意:示例代码使用了C#8.0的语法特性,如果要在你的机器上运行,请确保安装了.Net Core 3.x开发环境。KeyAttribute特性首先创建一个用于提示键名映射的特性:[AttributeUsage(AttributeTarget...原创 2020-02-22 23:53:21 · 896 阅读 · 0 评论 -
用C#实现一个Json解析器(5)——语法分析器
目录前言语法分析器接口基本语法分析器类泛型方法带Type参数的方法dynamic方法前言本次我们实现解析器的语法分析功能。注意:示例代码使用了C#8.0的语法特性,如果要在你的机器上运行,请确保安装了.Net Core 3.x开发环境。语法分析器接口因为我们要通过多态来实现两种语法分析器的分离,所以提取一个语法分析器接口IParser:interface IParser{ T...原创 2020-02-20 20:21:00 · 1109 阅读 · 0 评论 -
用C#实现一个Json解析器(4)——词法分析器
目录前言单词类和词性类前言本次我们实现解析器的词法分析功能。单词类和词性类词法分析器输出的是单词流,所以先要有单词类。这里有三点需要声明:单词这种轻量级对象,直接将其声明成结构体能让它们在内存中连续分布,并且不用消耗额外空间生成引用变量。我们不需要修改单词变量,因此直接声明为只读结构。属性的本质是方法,需要切换上下文。为了提高性能,我们直接使用公有字段。internal rea...原创 2020-02-18 21:36:10 · 739 阅读 · 0 评论 -
用C#实现一个Json解析器(3)——详细设计②
目录前言加入公有成员前言上回我们已经得到了简单类图,这次就来细品一下每个类应该长什么样,需不需要再增加辅助类。加入公有成员首先来给每个类加入成员:Lexer:词法分析器的任务是把Json字符串转换成单词流,只有一个方法Analyze。Token:单词显然是一个值对象,只有Value和TokenType两个只读属性。考虑到值类型的效率比引用类型高,把Token设计成结构体会更好。Pa...原创 2020-02-16 10:40:20 · 423 阅读 · 0 评论 -
用C#实现一个Json解析器(2)——详细设计①
目录前言类提取必要的类扩展UML类图第一阶段成果前言上回我们列出了解析器的全部功能并逐条进行了分析。这次我们以上次的分析结果作为依据设计出整个系统的框架。类提取类和对象是OO系统的一等公民。我们在设计OO系统时,肯定要先做类提取。下面就分几步进行这个过程,最后设计出系统的完整类图。必要的类Lexer(词法分析器):将Json字符串转换成C#对象,本质是一个翻译的过程。首先,需要整个J...原创 2020-02-14 13:23:21 · 397 阅读 · 0 评论 -
用C#实现一个Json解析器(1)——功能清单
目录前言功能清单基本功能附加功能需求细化前言Json是一种轻量级的数据交换格式,语法非常简单,同时能满足大部分需求。支持常见的几种数据类型,支持嵌套。因其体量轻、可以直接和前端JS交互的特点,常被用于前后端的数据传输。此外,由于轻便易解析,Json还在许多软件中代替XML、INI等格式作为配置文件使用。下面我们用C#实现一个简单的Json解析器,在支持基本的对象和Json字符串映射功能的同时...原创 2020-02-12 22:15:04 · 528 阅读 · 0 评论