首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有ppx_deriving_yojson的sum类型变体的自定义json生成器

具有ppx_deriving_yojson的sum类型变体的自定义json生成器
EN

Stack Overflow用户
提问于 2020-03-18 01:51:41
回答 1查看 57关注 0票数 1

我想生成表示一个AST的JSON对象,并且我正在研究ppx_deriving_yojson (更具体地说是to_yojson部分)来实现这一点。现在,当我想求助于定制编码时,当然有一些特殊的情况。正如在the documentation中提到的,定制记录字段的表示很容易:

代码语言:javascript
复制
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 }

将会给我

代码语言:javascript
复制
val j1 : Yojson.Safe.t = `Assoc [("test", `Int 0); ("test1", `String "1")]

但在某些地方,我希望为sum类型的变体提供自定义表示,而to_yojson属性在这里似乎无法识别:

代码语言:javascript
复制
type foo = Bar | Bla of string [@to_yojson fun s -> `String (s ^ "_suffix")]
[@@deriving to_yojson]

let j2 = foo_to_yojson (Bla "bla")

给了我

代码语言:javascript
复制
val j2 : Yojson.Safe.t = `List [`String "Bla"; `String "bla"]

ppx_deriving_yojson的默认编码。是我遗漏了什么,还是根本不可能实现我想要的?

注意:结果是以utop#require "ppx_deriving_yojson";;作为第一个命令得到的

EN

回答 1

Stack Overflow用户

发布于 2020-03-18 15:24:02

我忘记了内联记录。这将大致完成我想要的操作:

代码语言:javascript
复制
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"})

给出

代码语言:javascript
复制
val j2 : Yojson.Safe.t =
  `List [`String "Bla"; `Assoc [("bla", `String "bla_suffix")]]

然而,尽管此解决方案适用于全新的开发,但它将意味着对现有类型的重大重构工作。因此,我仍然在寻找一种侵入性较小的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60727708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档