一个格式: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。
- 序列化一侧:
Serializer<W, F>是一个 writer 加一个Formatter;状态对象Compound用State决定写不写逗号,Formatter的钩子决定标点和缩进;字符串查ESCAPE表转义,数字用 itoa 和 zmij;MapKeySerializer规定什么能当键;写出器不缓冲,每段输出都是一次write_all。 - 反序列化一侧:
Deserializer<R: Read>和Read的三个实现,parse_str在这里决定能不能借用输入;deserialize_any按首字节分派,递归深度限制,尾部字符检查。 - 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;这一部分讲被调用的那一侧。
💬 关联讨论
发起讨论加载中...