gpt4 book ai didi

haskell - Aeson:将动态键解析为类型字段

转载 作者:行者123 更新时间:2023-12-02 10:56:19 28 4
gpt4 key购买 nike

假设有一个像这样的 JSON:

{
"bob_id" : {
"name": "bob",
"age" : 20
},
"jack_id" : {
"name": "jack",
"age" : 25
}
}

是否可以使用如下定义的 Person 将其解析为 [Person]

data Person = Person {
id :: Text
,name :: Text
,age :: Int
}

最佳答案

您无法从字面上定义 [Person] 的实例,因为 aeson 已经包含 [a] 的实例,但是您可以创建一个新类型,并提供一个实例为此。

Aeson 还包括实例 FromJSON a => FromJSON (Map Text a),这意味着如果 aeson 知道如何解析某些内容,它就知道如何解析该内容的字典。

您可以定义一个类似于字典中值的临时数据类型,然后使用 Map 实例定义 FromJSON PersonList,其中 newtype PersonList = PersonList [Person]:

data PersonInfo = PersonInfo { infoName :: Text, infoAge :: Int }

instance FromJSON PersonInfo where
parseJSON (Object v) = PersonInfo <$> v .: "name" <*> v .: "age"
parseJSON _ = mzero

data Person = Person { id :: Text, name :: Text, age :: Int }
newtype PersonList = PersonList [Person]

instance FromJSON PersonList where
parseJSON v = fmap (PersonList . map (\(id, PersonInfo name age) -> Person id name age) . M.toList) $ parseJSON v

关于haskell - Aeson:将动态键解析为类型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32421836/

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