Haskell(Aeson):如何从JSON中构造一个带有附加值的记录
我有一个记录,我想用JSON字符串中的一些值以及另外提供的一些值来构造它 例如-给定以下记录:Haskell(Aeson):如何从JSON中构造一个带有附加值的记录,json,haskell,aeson,Json,Haskell,Aeson,我有一个记录,我想用JSON字符串中的一些值以及另外提供的一些值来构造它 例如-给定以下记录: data MyRecord = MyRecord { a :: String, b :: Int, c :: String } 我想定义一个函数: createMyRecord :: String -> String -> Maybe MyRecord createMyRecord json cValue = ??? 我希望能够这样称呼: createMyRecord "{\"a\":
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 })
来自JSON MyRecord的实例,其中
parseJSON=withObject“MyRecord”$\o->do
也许是我的记录
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)
abParser::String->Value->Parser MyRecord
abParser valueC=withObject“MyRecord”$\o->do
也许是我的记录
createMyRecord json valueC=解码json>>=parseMaybe(abParser valueC)
是否要生成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)
abParser::String->Value->Parser MyRecord
abParser valueC=withObject“MyRecord”$\o->do
也许是我的记录
createMyRecord json valueC=解码json>>=parseMaybe(abParser valueC)
太好了,谢谢!我知道有一个简单的解决方案,但我正在努力解决。太好了,谢谢!我知道有一个简单的解决方案,但我正在努力解决它。