我想生成表示一个AST的JSON对象,并且我正在研究ppx_deriving_yojson (更具体地说是to_yojson部分)来实现这一点。现在,当我想求助于定制编码时,当然有一些特殊的情况。正如在the documentation中提到的,定制记录字段的表示很容易:
type bar = { test: int;
test1: int [@to_yojson fun i -> `String (string_of_int i)] }
[@@deriving to_yojson]
let j1 = bar_to_yojson { test = 0; test1 = 1 }将会给我
val j1 : Yojson.Safe.t = `Assoc [("test", `Int 0); ("test1", `String "1")]但在某些地方,我希望为sum类型的变体提供自定义表示,而to_yojson属性在这里似乎无法识别:
type foo = Bar | Bla of string [@to_yojson fun s -> `String (s ^ "_suffix")]
[@@deriving to_yojson]
let j2 = foo_to_yojson (Bla "bla")给了我
val j2 : Yojson.Safe.t = `List [`String "Bla"; `String "bla"]即ppx_deriving_yojson的默认编码。是我遗漏了什么,还是根本不可能实现我想要的?
注意:结果是以utop和#require "ppx_deriving_yojson";;作为第一个命令得到的
发布于 2020-03-18 15:24:02
我忘记了内联记录。这将大致完成我想要的操作:
type foo = Bar | Bla of { bla: string [@to_yojson fun s -> `String (s ^ "_suffix")]}
[@@deriving to_yojson]
let j2 = foo_to_yojson (Bla { bla = "bla"})给出
val j2 : Yojson.Safe.t =
`List [`String "Bla"; `Assoc [("bla", `String "bla_suffix")]]然而,尽管此解决方案适用于全新的开发,但它将意味着对现有类型的重大重构工作。因此,我仍然在寻找一种侵入性较小的解决方案。
https://stackoverflow.com/questions/60727708
复制相似问题