Пользовательский генератор json для варианта типа суммы с ppx_deriving_yojson - PullRequest
1 голос
/ 17 марта 2020

Я бы хотел сгенерировать 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";; в качестве первой команды

1 Ответ

0 голосов
/ 18 марта 2020

Я забыл про встроенные записи. Это будет примерно то, что я хочу:

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")]]

Однако, хотя это решение работает для совершенно новой разработки, оно подразумевает значительные усилия по рефакторингу для существующих типов. Таким образом, я все еще ищу менее навязчивое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...