json - 如何更改 ppx_yojson_conv 表示变体的方式?

标签 json parsing ocaml

我正在尝试以 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/

相关文章:

python - 使用来自 JSON 响应的数据

javascript - 在 Highcharts 中绘制 2 条线。 JSON格式错误?

ios - Swift 3.0 - 从 XCode 包中读取 .JSON 文件

python - 动态设置 PyQt 应用程序的版本

http - 如何在 OCaml 中发出简单的 GET 请求?

C - 解析带有未知数量参数的命令行

java - 解析和替换字符串中的值

ios - 从 json 的字典中解析字典

ocaml - OCaml 中的整数构造函数

types - OCaml 类型转换的区别