gpt4 book ai didi

haskell - 如何允许数组单个元素解析失败,同时保留其他元素?

转载 作者:行者123 更新时间:2023-12-02 10:10:50 27 4
gpt4 key购买 nike

我有一个表现不佳的 json 源。它经常提供意外的 JSON,其中包含格式错误的数组元素。我想解析此 JSON 并忽略任何格式错误的数组元素。

这是我的尝试:

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Control.Applicative ((<$>), (<*>))
import Control.Monad (mzero)
import Data.Aeson
import Data.ByteString.Lazy.Char8 (ByteString, pack)

data Foo = Foo Integer [Maybe Bar] deriving (Show)
data Bar = Bar Integer Integer deriving (Show)

instance FromJSON Foo where
parseJSON (Object v) = Foo <$> (v .: "a") <*> (v .: "b")
parseJSON _ = mzero

instance FromJSON Bar where
parseJSON (Object v) = Bar <$> (v .: "c") <*> (v .: "d")
parseJSON _ = mzero

-- this string is malformed - second array element has an unexpected key
testString = pack "{\"a\":1, \"b\":[{\"c\":11, \"d\":12}, {\"C\":21, \"d\":22}, {\"c\":31, \"d\":32}]}"

-- want this to be:
--
-- Just (Foo 1 [Just (Bar 11 12),Nothing,Just (Bar 31 32)])
--
-- or
--
-- Just (Foo 1 [Just (Bar 11 12),Just (Bar 31 32)])
main = print $ (decode testString :: Maybe Foo)

teststring格式错误时,Foo的整个解码将返回Nothing。我希望解析 Foo,但 b 的任何格式错误的数组元素都为 Nothing

最佳答案

您不能依赖 FromJSON 的默认实现对于列表,您需要自己做更多的工作:

instance FromJSON Foo where
parseJSON (Object v) = do
a <- v .: "a"
bList <- v .: "b"
return $ Foo a $ map (parseMaybe parseJSON) bList

parseMaybe parseJSON函数的类型为 FromJSON a => Value -> Maybe a ,所以bList :: [Value]含义map (parseMaybe parseJSON) bList :: [Maybe Bar] 。考虑到the documentation,这可能是最好的方法。 (请参阅“解码混合类型对象”)使用类似的方法来解析表现不佳的 JSON。

关于haskell - 如何允许数组单个元素解析失败,同时保留其他元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31644236/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com