Haskell (Aeson) : 如何从 JSON 构造带有附加值的记录

Haskell (Aeson) : How to construct a record from JSON with additional values

我有一条记录,我想用 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 方法(我也对其他图书馆开放)?

谢谢!

您要构建 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)