Я бы хотел сгенерировать JSON объектов, представляющих AST, и я смотрю на 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")]
Но есть места, где я ' Я хотел бы иметь пользовательское представление для варианта типа суммы, и атрибут 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";;
в качестве первой команды