Aeson 合并对象编码

2023-12-02

我想解析和编写具有一些共同基本属性和一些附加单独属性的 JSON 对象。例如,假设我们有两种类型的对象User and Email。两种类型共享相同的基本属性foo and bar,但它们具有特定于其类型的附加属性:

User:
{"foo": "foo", "bar": "bar", "user": "me", "age": "42"}

Email:
{"foo": "foo", "bar": "bar", "email": "[email protected]"}

我已经写了FromJSON and ToJSON单独对象的实例User, Email, and Base。现在我的想法是定义一个包装对象结合Base以及任何其他类型FromJSON and ToJSON实例。

data Wrapper a = Wrapper Base a

instance FromJSON a => FromJSON (Wrapper a) where
  parseJSON = withObject "Wrapper" $ \v -> Wrapper <$> parseJSON (Object v) <*> parseJSON (Object v)

instance ToJSON a => ToJSON (Wrapper a) where
  toJSON (Wrapper base a) = Object (toObject "base" (toJSON base) <> toObject "custom" (toJSON a))
    where
      toObject :: Text -> Value -> KeyMap Value
      toObject _ (Object v) = v
      toObject key v = KeyMap.singleton (Key.fromText key) v

  toEncoding = genericToEncoding defaultOptions

The FromJSON实施似乎工作得很好。还有toJSON函数似乎将所有属性打包到一个对象中。不幸的是,我找不到合并两者的解决方案Encoding在一起。默认toEncoding实现将基本属性和自定义属性打包在两个单独的 JSON 对象中,并合并底层Builder with unsafeToEncoding也没有帮助。

有没有aeson我完全缺少功能或者是否有更简单的方法来解决我的问题?任何帮助表示赞赏。谢谢!


Update

感谢 Daniel Wagner 的回答,我定义了一个新的类型类ToObject并使包装器数据类型更加通用。

newtype Merged a b = Merged (a, b)
  deriving stock (Show, Generic)
  deriving newtype (Eq)

class ToObject a where
  toObject :: a -> Object
  toSeries :: a -> Series

instance (ToObject a, ToObject b) => ToObject (Merged a b) where
  toObject (Merged (a, b)) = toObject a <> toObject b
  toSeries (Merged (a, b)) = toSeries a <> toSeries b

instance (FromJSON a, FromJSON b) => FromJSON (Merged a b) where
  parseJSON = Json.withObject "Merged" $ \v -> fmap Merged ((,) <$> parseJSON (Object v) <*> parseJSON (Object v))

instance (ToObject a, ToObject b) => ToJSON (Merged a b) where
  toJSON = Object . toObject
  toEncoding = Json.pairs . toSeries

您可以使用构建您需要的内容pairs and pair.

class ToObject a where toObject :: a -> Series

instance ToObject Base where
    toObject b = "foo" .= foo b <> "bar" .= bar b -- but no Ken, how sad
instance ToObject User where
    toObject u = "user" .= user u <> "age" .= age u
instance ToObject a => ToObject (Wrapper a) where
    toObject (Wrapper base a) = toObject base <> toObject a

instance (ToObject a, ToJSON a) => ToJSON (Wrapper a) where
    toJSON = -- as before
    toEncoding = pairs . toObject
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Aeson 合并对象编码 的相关文章

  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 如何将此数据编码为 JSON 中的父/子结构

    我正在使用 d3 js 将动物 有机体 家族 一次最多 4000 个 可视化为树形图 尽管数据源也可以是目录列表或命名空间对象列表 我的数据如下 json organisms name Hemiptera Miridae Kanakamir
  • 带有 RankNTypes 扩展的奇怪类型推断

    我正在尝试在 Haskell 中尝试 System F 类型 并通过以下方式实现了自然数的 Church 编码type 当加载这段代码时 OPTIONS GHC Wall LANGUAGE RankNTypes type CNat fora
  • 使用 NewtonSoft 在一行中生成 JSON 对象

    我正在使用 JSON 库牛顿软件 http nuget org packages newtonsoft json生成 JSON 字符串 JObject out JObject FromObject new typ photos return
  • 全局传递 xhr onload 函数的值

    在我正在创建的应用程序中 我有以下 XMLHttpRequest 并且我正在尝试传递结果data在 的里面xhr onload 到在同一父函数中创建的数组中 var url http api soundcloud com resolve j
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • Haskell:不在范围内:数据构造函数

    今天开始在学校学习 haskell 我遇到了函数问题 我不明白为什么它不在范围内 代码如下 ff Char gt Char gt Char ff A B x 0 y 1 x lt A y lt B x 1 y 0 和错误 md31 hs 2
  • 在 ASP.NET Core 2.0 Web Api 中返回“原始”json

    AFAIK 在 ASP NET Core Web Api 中返回数据的标准方法是使用IActionResult并提供例如一个OkObject结果 这对于对象来说效果很好 但是如果我以某种方式获得了一个 JSON 字符串 并且我只想将该 JS
  • Groovy - JsonSlurper 解析 JSON 文件

    我有一个类似于下面的 JSON 文档 我正在尝试在 Groovy 中解析它 基本上对于每所学校 学校信息 我想抓住SCHOOL COUNTRY和其他领域 我正在尝试下面的代码 但它没有返回我需要的内容 对于列出的每所学校 1 000 所 我
  • Haskell Data.Decimal 作为 Aeson 类型

    是否可以解析一个数据 十进制 https hackage haskell org package Decimal 0 4 2 docs Data Decimal html使用 Aeson 包从 JSON 获取 假设我有以下 JSON foo
  • 在 Android 中使用 DataOutputStream 在 POST 正文中发送特殊字符 (ë ä ï)

    我目前正在开发一个具有大量服务器端通信的 Android 应用程序 昨天 我收到一份错误报告 称用户无法发送 简单 特殊字符 例如 我搜索过但没有找到任何有用的东西 可能重复 没有答案 https stackoverflow com que
  • 如何打乱列表?

    如何从一组数字 1 2 3 直到我击中x 我的计划是重新调整列表 1 2 3 并把它砍在x chopAt 3 2 3 1 2 3 chopAt 3 2 1 3 2 1 3 chopAt 3 3 1 2 3 chopAt chopAt x y
  • 类型级别集结合律的证明

    我试图证明类型级函数Union https hackage haskell org package type level sets 0 8 5 0 docs Data Type Set html t Union是关联的 但我不确定应该如何完
  • 如何在 Swift 3 中解析 JSON 数组 [重复]

    这个问题在这里已经有答案了 我从 Socket 获取了一些我想访问的数据 但收到错误消息 指出每次都无法将 NSArray 转换为 NSDictionary struct SocketEventHandler let event Strin
  • JSON 解析错误:需要“STRING”

    我在用JSONLint http jsonlint com 解析一些 JSON 我不断收到错误 错误 第 1 行解析错误 产品 需要 STRING 却得到 未定义 这是代码 product code Abc123 description S
  • 如何更换HXT中的节点?

    给定一个示例 xml 文件
  • 键绑定 - 鼠标中键与 Sublime Text 2

    有谁知道是否可以将鼠标中键绑定到 Sublime Text 2 中的操作 我知道可以进行一些鼠标交互 因为您可以使用后退和前进按钮 基本上 我将使用此按钮通过 sFTP 插件上传文件 这样我需要按下的按钮数量就会从 3 个减少到 1 个 目
  • 通过标识引用对象的标准方法(例如循环引用)?

    JSON 中是否有通过身份引用对象的标准方法 例如 具有大量 可能是循环 引用的图形和其他数据结构可以被合理地序列化 加载吗 Edit 我知道做一次性解决方案很容易 列出图中所有节点的列表 然后 我想知道是否有一个标准的 通用的解决方案来解
  • 使用 json_encode() 函数在 PHP 数组中生成 JSON 键值对

    我正在尝试以特定语法获取 JSON 输出 这是我的代码 ss array 1 jpg 2 jpg dates array eu gt 59 99 us gt 39 99 array1 array name gt game1 publishe
  • Hive:如何分解嵌入 CSV 文件中的 JSON 列?

    从 CSV 文件 带有标题和管道分隔符 中 我得到了以下两个内容 其中包含一个 JSON 列 内部有一个集合 如下所示 第一种情况 使用没有名称的 JSON 集合 ProductId IngestTime ProductOrders 918

随机推荐

  • 使用 C++ 的原理与实践中头文件中的错误消息

    我刚刚开始使用 编程 使用 C 的原理和实践 学习 C 那本书告诉我使用一个头文件来为我设置一些东西 有问题的头文件位于http www stroustrup com Programming std lib facilities h 我正在
  • WPF 中的用户控件位置

    我是 WPF 新手 我创建了一个新的 UserControl MyUserControl 现在我很惊讶 UserContol 没有位置 我如何读取 通过代码 myUserControl1 Location在父容器中 我解释 我有一些点 用户
  • Docusign 代表发送 (SOBO)

    如果有人有 我欢迎提供有关如何使用 Docusign 的代表发送 SOBO 功能的示例 我正在使用带有 XML 的 SOAP API 甚至 Docusign 的 III 级支持也无法提供示例 Thanks 2021 年 4 月更新 新的 R
  • java.rmi.ConnectException:连接拒绝主机:127.0.1.1;

    java rmi ConnectException Connection refused to host 127 0 1 1 nested exception is java net ConnectException Connection
  • 如何将 JPA 字段持久化为 clob?

    我有一个类不能很好地序列化为关系实体 因此 我想使用 JPA 作为 CLOB 来持久化它 我可以将它序列化为字符串 我该如何使用 JPA 来做到这一点 示例实体 Entity Table name MY TABLE public class
  • 如何使用 const getter 对 std::set 进行排序

    我有一个 std set 容器 其元素是以下类的对象 class LaneConnector public const Lane getLaneFrom const return From const Lane getLaneTo cons
  • 上午 12 点和下午 12 点的时间正则表达式

    我做了这个正则表达式 00 0 0 9 1 012 0 5 0 9 a p m A P M 但问题是它正在接受 00 00 am 我不想这样 如何忽略 我希望时间采用这种格式 上午 12 12 它不应该在这个 上午 00 21 我正在使用此
  • Spring Boot 触发完全重启,而不是在静态文件发生更改时重新加载

    In my Spring Boot项目我有以下结构 src main java resources static css js img webapp WEB INF views 根据文档排除资源 里面的资源static 应该触发一个relo
  • Woocommerce 产品自定义字段:检查输入是否已存在

    我安装了这个 WC Fields Factory 插件来向产品添加新字段 但我需要检查这个新文本框的值是否已存在于数据库中 举个例子 比如在注册时您不能使用已在使用的电子邮件 我必须像屏幕上一样添加文本字段 Update 2 处理字段验证
  • 在视频中跳转到数组中的时间

    沿着以下路线控制 HTML5 视频中的开始位置和播放时长 我试图在每个片段播放完毕后自动从一个片段跳转到下一个片段 每个分段将具有相同的持续时间 并且每个分段的开始时间将位于一个数组中 我似乎无法弄清楚如何在 addEventListene
  • 读取访问冲突 0xCDCCDCCD

    我不断遇到读取访问冲突 这是我的代码 class List public List List const List copy List List operator const List rhs Record headPtr const vo
  • 活动更改的翻转动画

    我想在两个活动之间切换 就像 iPhone 一样 我尝试使用 overridePendingTransition int EnterAnim int exitAnim 方法 但没有成功 有人实现过这样的动画吗 fesp 当您必须更改 Act
  • Java 原生数组长度

    我在 Java 中有一个二维双精度数组 它基本上是一个值表 我想知道它有多少行 它在其他地方声明 并分配 如下 double table 然后传递给一个函数 private void doSomething double table 在我的
  • Java 和 SQL:返回 null 还是抛出异常?

    这是另一个有争议的主题 但这次我只寻找简单且有记录的答案 场景 我们假设以下方法 我会避免以下情况 sql append SELECT FROM append dogs table sql append WHERE append colNa
  • 将 C++20 模板化 Lambda 传递给函数然后调用它

    我试图将模板化 lambda 传递给函数 然后使用模板参数调用它 以启用该函数针对自定义类型的专门化 但是当我尝试调用 lambda 时 出现此错误 error invalid operands to binary expression 对
  • 使用“or”的基本 Python If 语句

    我正在遵循一个学习 python 的初学者计划 我正在努力寻找一种更好的方法来使用具有多种可能性的 if 语句 我正在编写一个基于文本的基本游戏 用户可以选择三种不同的难度级别 简单 中等 困难 我只是想编写接受 1 2 或 3 的代码来告
  • 不允许我将编辑保存到 appsscript.json

    我想访问与用户 Google 帐户关联的名称来解决GoogleJsonResponseException API call to people people get failed with error The caller does not
  • 发送 GuzzleHttp\Psr7\Request 时 Guzzle6 错误资源类型无效:数组

    我试图使用 GuzzleHttp Psr7 Request 发送代码 不知何故我收到错误 Invalid resources type array 以下是我的代码 params name gt myName id gt myId clien
  • 为什么 JavaScript 中的“假”是真的?

    我知道在 javascript 中空字符串是假的 非空字符串在 javascript 中是真的 然而 为什么是 false javascript中的真相 规范中有什么明确的内容吗 这是性能问题还是在某些情况下您需要字符串 false 代表t
  • Aeson 合并对象编码

    我想解析和编写具有一些共同基本属性和一些附加单独属性的 JSON 对象 例如 假设我们有两种类型的对象User and Email 两种类型共享相同的基本属性foo and bar 但它们具有特定于其类型的附加属性 User foo foo