我正在尝试以 ocaml 类型对 elasticsearch DSL 进行建模。通常,有些事物可以通过变体很好地建模,其中标签是对象中的单例键。例如interval queries ,我们可能有一个匹配、一个前缀、一个通配符等。DSL 表示这些就像这样;
{"match": {...match params}}
{"wildcard": {...wildcard params}}
{"prefix": {...prefix params}}
手动写出yojson_of_x
函数似乎是大量的样板文件,所以我想导出它们,但是ppx_yojson_conv说它代表这样的变体;
["match", {...match_params}]
有没有办法添加一些其他注释来让它改变其行为?来自铁锈世界,serde将此称为“外部标记”表示,但我不知道是否可以以类似的方式配置ppx_yojson_conv
。
最佳答案
您无法更改 ppx_yojson_conv 使用的表示形式,但您可以在顶部添加一个层来执行您想要的转换:
let to_assoc: [> Yojson.Safe.t ] -> Yojson.Safe.t as 'a = function
| `List (`String key::l) -> `Assoc [key,`List l]
| x -> x
let to_list = function
| `Assoc [key,`List l] -> `List (`String key::l)
| x -> x
然后您可以使用以下方法将 yojson
转换器转换为您自己的转换器:
type t =
| A of int
| B of int
[@@deriving yojson]
let yojson_of_t x = to_assoc (yojson_of_t x)
let t_of_yojson x = t_of_yojson (to_list x)
关于json - 如何更改 ppx_yojson_conv 表示变体的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70917952/