我想生成代表 AST 的 JSON 对象,我正在考虑ppx_deriving_yojson
这样做(更具体地说是to_yojson
部分)。现在,当我想求助于自定义编码时,当然有一些极端情况。如文档中所述,自定义记录字段的表示很容易:
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";;
作为第一个命令获得的