gpt4 book ai didi

haskell - 使用 Aeson 泛型构造 JSON,其中一个值作为包含另一个值的键

转载 作者:行者123 更新时间:2023-12-02 13:29:05 24 4
gpt4 key购买 nike

尝试一下 github gist API,同时尝试使用 Aeson JSON 库。我在生成的 ToJSON 实例方面遇到了问题,并且不知 Prop 体如何解决。

我需要在内部包含一个值,并且与该值关联的键也需要是一个值而不是预定义的键名称。显示起来比较容易一些。所需的输出是,

{
"public": true,
"description": "Something..",
"files": {"This Thing.md": {"content": "Here we go!"}}
}

其中文件名的值保存内容,但目前我得到,

{
"public": true,
"description": "Something..",
"files": {"filename": "This Thing.md", "content": "Here we go!"}
}

这并不是我真正需要的。当前代码是,

{-# LANGUAGE OverloadedStrings, DeriveGeneric #-}
import Data.Text (Text)
import Data.Aeson
import GHC.Generics

data GistContent = GistContent
{ filename :: Text
, content :: Text
} deriving (Show, Generic)

instance ToJSON GistContent

data Gist = Gist
{ description :: Text
, public :: Bool
, files :: GistContent
} deriving (Show, Generic)

instance ToJSON Gist

假设这是可能的,我的数据结构需要如何获取所需的输出?..如果使用泛型不可能做到这一点,我如何使用 ToJSON 实例来实现它(我可以'也不太清楚那里的结构)?

最佳答案

您的问题源于不正确的架构。 files 目前只能包含一个 GistContent,这是不必要的限制。相反,您需要一个 GistContent 列表:

data Gist = Gist
{ description :: Text
, public :: Bool
, files :: [GistContent]
} deriving (Show, Generic)

现在考虑对 Gist 的另一个约束:每个 GistContent 必须具有不同的文件名。强制执行此操作的数据结构为 Data.HashMap.Strict.HashMap 。从 GistContent 中取出 filename 并使用文件名作为键:

data GistContent = GistContent
{ content :: Text
} deriving (Show, Generic)

data Gist = Gist
{ description :: Text
, public :: Bool
, files :: HashMap Text GistContent
} deriving (Show, Generic)

一切顺利。

关于haskell - 使用 Aeson 泛型构造 JSON,其中一个值作为包含另一个值的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21358563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com