Haskell(Aeson):如何使用附加值

时间:2018-05-18 20:49:34

标签: json haskell aeson

我有一条记录,我想用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(我也对其他图书馆开放)这样做,任何人都可以推荐?

谢谢!

1 个答案:

答案 0 :(得分:4)

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