我的程序依赖于一个库,该库将我提供的 JSON 解码为其内部数据类型。
该库试图封装太多内容。它隐藏了连接详细信息、数据序列化格式和幕后使用的 RPC,因此易于使用。
问题是该库拒绝我必须在我的环境中处理的 JSON。换句话说,它拒绝处理 JSON 有效负载的常见错误,例如大写/小写差异、意外但无害的 key 、可恢复的数字/字符串编码错误。
我不能依赖 newtype
技巧,因为库期望使用具体的数据类型 - 而不是我的。我需要更改它用于反序列化的“内部”类实例。
由于没有更好的想法,我 fork 了该库,并将其添加为从本地目录构建的依赖项(还必须删除所有相关的 stack
以便构建能够注意到)。
数据类型未更改,仅更改了序列化格式,从而使此更改与当前的问题隔离。
是否有更好的方法来覆盖库提供的类实例定义?
最佳答案
我已经遇到过几次类似的问题,这很烦人。如果您还没有考虑的话,可以考虑一些选项:
我们希望该库提供 Haskell 组合器来构建内部类型。然后,您可以包装该类型并提供替代的
FromJSON
实例:newtype WrappedT = WrappedT { toT :: Library.T } deriving (All, The, Classes, You, Care, About) instance FromJSON WrappedT where -- better instance
对 JSON 进行预规范化,即编写一个 JSON 到 JSON 的层来删除 Not Acceptable 位。
- 如果您不想维护 fork ,请将 PR 推送给作者,公开
.Internal
模块中的内部结构,然后您可以执行解决方案 1。这将保持兼容性,同时仍然允许你的改变。 (我个人也认为这样的“软封装”比更常见的“硬封装”对社区来说更好)
如果您提供问题的更多详细信息,您可能会想到其他解决方案。
关于haskell - 覆盖 Haskell 中封装不良的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53749540/