找回密码
 立即注册
首页 业界区 业界 从零开始: c#纯代码实现完整Json解析器的全过程及注释与 ...

从零开始: c#纯代码实现完整Json解析器的全过程及注释与自定义格式的支持实现

常士 2025-9-20 17:38:26
大家好!我们要深入探讨一个非常常用的技术:JSON反序列化。别小看这个技术,它可是现代编程中不可或缺的一部。JSON解析不仅仅是简单的数据转换,它还涉及到复杂的词法分析和文法解析。这些技术是编译器设计的基础,但这不是我们今天要深入探讨的内容。
我们想通过一些简化的方法和直觉的思考,以纯c#代码为例,分享实现自己的可自定义的JSON解析器的过程,希望大家可以更好地理解数据结构和算法,提升编程能力。
文中完整的代码和项目,已基于MIT协议开源。你可以自由地使用、修改和分发。你可以根据自己的需求进行定制,随意集成。所以,让我们开始吧。
一、先来认识一下JSON

1.1 什么是JSON?

JSON就像是一种"数据语言",用来在不同的程序之间传递信息。比如:
  1. {
  2.   "name": "小明",
  3.   "age": 20,
  4.   "isStudent": true,
  5.   "hobbies": ["篮球", "音乐", "编程"]
  6. }
复制代码
你看,这就是一个JSON对象,它很像我们C#中的类. 但JSON里面的取值只有几种有限的基础类型:
  1. string:就是文本,比如"你好";
  2. number:数字,比如123, -1.2, 1E-4;
  3. bool:布尔值true或false;
  4. array:包含多个取值的集合
  5. map:包含多个键值对的集合
复制代码
很清楚的能看到,用什么语言解析json第一步是需要将json中的取值映射到该语言下的对应类型中. 对于c#, 我们仅需要考虑几个简单类型即可:
string对应text in C#
double,int对应number in C#
bool对应bool in C#
array对应 List in C#
map对应Dictionaryin C#
1.2 为什么要反序列化?


  • 想象一下:你的朋友用微信给你发了一条消息,这条消息需要从"网络格式"转换成你能看懂的文字。JSON反序列化就是做类似的事情.
  • 另外就是关于数据的存储,因为复杂的结构化数据不能一直放在内存中,当要进入磁盘持久化时,可以选择将对象存储为JSon,清晰易读,现在很多程序的配置文件都是这么用的.
1.3 为什么要尝试单独实现?

很多自定义的场景,包括但不限于:

  • 特殊场景的极限性能考虑,轻量级无需反射
  • 特殊注释的实现 ( 根据JSON标准(RFC 8259),JSON格式不支持注释。这就是为什么很多严格的JSON解析器遇到注释会报错。)
  • 无需考虑源生成,简单场景直接AOT编译
  • 高度频繁修改的对象, 无需修改映射的实体对象.
二、解析主流程

整体流程就像拆快递包裹:拿到大包裹 -> 拆开大包裹 -> 如果大包裹里有小包裹 -> 再拆开小包裹
[code]开始拆快递(Parse方法)    ↓拿出小刀准备开箱(创建JsonReader)    ↓判断里面是什么(ReadValue方法)    ↓根据包装形状决定怎么拆:   
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册