【问题标题】:Haskell (Aeson) : How to construct a record from JSON with additional valuesHaskell (Aeson) : 如何从 JSON 构造带有附加值的记录
【发布时间】:2018-05-18 20:49:33
【问题描述】:

我有一条记录,我想用 JSON 字符串中的一些值以及一些额外提供的值来构造。

例如 - 给定以下记录:

data MyRecord = MyRecord { a :: String, b :: Int, c :: String }

我想定义一个函数:

createMyRecord :: String -> String -> Maybe MyRecord
createMyRecord json cValue = ???

我希望能够这样称呼:

createMyRecord "{\"a\": \"a value\", \"b\": 100}" "c value"

目前,我正在使用 Aeson 为非 JSON 的值创建具有默认值(即空字符串和零)的记录。然后,我创建了一个新版本的记录,并更新了其他字段。像这样的:

instance FromJSON MyRecord where
    parseJSON = withObject "MyRecord" $ \o -> do
        valueA <- o .: "a"
        valueB <- o .: "b"
        return MyRecord { a = valueA, b = valueB, c = "" }

createMyRecord :: String -> String -> Maybe MyRecord
createMyRecord json cValue =
    Aeson.decode json <$> (\r -> r { c = cValue })

这感觉有点麻烦 - 我想一次性创建包含所有值的记录,而不是一步一步地填充它们。有没有更好的方法来使用 Aeson(我也对其他库开放),任何人都可以推荐?

谢谢!

【问题讨论】:

    标签: json haskell aeson


    【解决方案1】:

    你想建立parseJSON吗?不一定是parseJSON...

    abParser :: String -> Value -> Parser MyRecord
    abParser valueC = withObject "MyRecord" $ \o -> do
        valueA <- o .: "a"
        valueB <- o .: "b"
        return MyRecord { a = valueA, b = valueB, c = valueC }
    
    createMyRecord :: ByteString -> String -> Maybe MyRecord
    createMyRecord json valueC = decode json >>= parseMaybe (abParser valueC)
    

    【讨论】:

    • 太好了,谢谢!我知道有一个简单的解决方案,但一直在努力解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多