Rust in Everything
基于 serde_json 1.0.154

一个格式:serde_json

前几部分讲的是 serde 的 trait 和 derive 生成的代码,格式一侧一直只露出几个方法名。这一部分把一个真实的格式从头读一遍:serde_json 1.0.154(tag v1.0.154)。只讲和主线有关的文件:ser.rs(2.3k 行)、de.rs 与 read.rs(3.9k 行)、value/、map.rs、number.rs、raw.rs。

  1. 序列化一侧:Serializer<W, F> 是一个 writer 加一个 Formatter;状态对象 Compound 用 State 决定写不写逗号,Formatter 的钩子决定标点和缩进;字符串查 ESCAPE 表转义,数字用 itoa 和 zmij;MapKeySerializer 规定什么能当键;写出器不缓冲,每段输出都是一次 write_all。
  2. 反序列化一侧:Deserializer<R: Read> 和 Read 的三个实现,parse_str 在这里决定能不能借用输入;deserialize_any 按首字节分派,递归深度限制,尾部字符检查。
  3. Value:Value 既实现 Serialize / Deserialize,又是 to_value / from_value 背后的格式;Number 的三种内部表示和 arbitrary_precision;Map 与 preserve_order;json! 宏;RawValue;同一份文档读成 Value 和读成 derive 类型的分配次数对比。
flowchart TB
  ty["Rust 类型"] -->|"to_string"| ser["序列化一侧"]
  ser --> text["JSON 文本"]
  text -->|"from_str"| de["反序列化一侧"]
  de --> ty
  de -->|"读成 Value"| val[Value]
  val -->|from_value| ty
  ty -->|to_value| val

axum 卷的 body 提取器讲 Json 提取器怎么调 serde_json::from_slice、怎么把错误分成 400 和 422;这一部分讲被调用的那一侧。

💬 关联讨论

发起讨论
加载中...