Lean 4(元)编程 Cookbook

JSON 与 TOML 互转🔗

把 TOML 转换成 JSON🔗

为了与其他系统互操作,把 TOML 数据转换成 JSON 格式常常很有用。下面的示例展示如何通过递归地把 TOML 结构映射到 Json,把你自己的 TOML Value 转换成一个 Json 对象。

open Lake Toml Lean /-- Recursive conversion from TOML Value to Json -/ partial def tomlToJson : Value Json | .string _ s => toJson s | .integer _ i => toJson i | .float _ f => toJson f | .boolean _ b => toJson b | .dateTime _ d => toJson (toString d) | .array _ arr => toJson (arr.map tomlToJson) | .table' _ tbl => let pairs := tbl.items.toList.map fun (k, v) => (k.toString, tomlToJson v) Json.mkObj pairs def egTomlToJson : CoreM Json := do let input := " [database] server = \"192.168.1.1\" ports = [ 8000, 8001, 8002 ] " let table parseToml input return tomlToJson (Value.table .missing table) {"database": {"server": "192.168.1.1", "ports": [8000, 8001, 8002]}}#eval egTomlToJson

把 JSON 转换成 TOML🔗

把 JSON 转换回 TOML 需要把 JSON 类型映射到对应的 TOML 构造子。由于 JSON 数字用 JsonNumber 表示,我们会尝试把它们转换成整数或浮点数。

open Lake Toml Lean /-- Recursive conversion from Json to TOML Value -/ partial def jsonToToml : Json Value | .null => .string .missing "null" | .bool b => .boolean .missing b | .num n => -- Check if it is a simple integer (exponent 0) if n.exponent == 0 then .integer .missing n.mantissa else .float .missing n.toFloat | .str s => .string .missing s | .arr a => .array .missing (a.map jsonToToml) | .obj o => let tbl := o.toList.foldl (fun t (k, v) => Table.insert k.toName (jsonToToml v) t) Table.empty .table .missing tbl def egJsonToToml : CoreM String := do let j := json% { "project": "Lean4", "meta": { "active": true, "version": 4 } } let val := jsonToToml j if let .table _ tbl := val then return ppTable tbl else return toString val "project = \"Lean4\"\n\n[meta]\nactive = true\nversion = 4\n"#eval egJsonToToml