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