回

15 / 17 · Handling JSON Data

JSON 是一种变体

外面的数据没有 OCaml 类型。先落成一个闭集,再投影成你的记录。

Yojson 把 JSON 收成多态变体:Null、Bool、数字、字符串、数组、对象。书后半用 atd 或 ppx 把这种变体映射成你自己的类型,并在失败时给出位置。

书桌用普通变体 json 代替多态变体,数字一律是 Num of float。先学会 match,再去记生成器的注解。

例子

utop
let j = Json.of_string "{\"lang\":\"OCaml\",\"year\":1996}"
val j : json = Obj ([("lang", Str "OCaml"); ("year", Num 1996.)])
match Json.member j "lang" with
| Some (Str s) -> s
| _ -> "?"
- : string = "OCaml"

改一改

改完再跑

解释器覆盖书前半的核心:函数、标签参数、模式、记录、变体、ref、模块,以及简化的 Map 和 JSON。没有 GADT 细化、Async 和独立编译。

先预测,再对照

1 / 2

这课里,JSON 数字 1996 会变成?

2 / 2

为什么不直接解析成一条大记录?

在书里读 Handling JSON Data