Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell(Aeson):如何从JSON中构造一个带有附加值的记录_Json_Haskell_Aeson - Fatal编程技术网

Haskell(Aeson):如何从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\":

我有一个记录,我想用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 })
来自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)

太好了,谢谢!我知道有一个简单的解决方案,但我正在努力解决。太好了,谢谢!我知道有一个简单的解决方案,但我正在努力解决它。