gpt4 book ai didi

json - Haskell、Aeson 和 JSON 解析成自定义类型

转载 作者:行者123 更新时间:2023-12-03 23:32:50 24 4
gpt4 key购买 nike

previous post ,我发现我完全被卡住了。我正在尝试将 JSON 结构解析为我自己的类型,不仅我坚持如何解析数组,我什至不确定我是否按预期使用 Aeson 库。任何帮助将不胜感激。

编码:

data Exif = Exif [(T.Text, ExifValue)] deriving (Show)
data ExifValue =
ExifText T.Text |
ExifInt Integer |
ExifDouble Double |
ExifBool Bool |
ExifArray [ExifValue]
deriving (Show)

instance FromJSON ExifValue where
parseJSON (Number (I n)) = return $ ExifInt n
parseJSON (Number (D n)) = return $ ExifDouble n
parseJSON (String s) = return $ ExifText s
parseJSON (Bool b) = return $ ExifBool b
-- parseJSON (Array a) = ?????

instance FromJSON Exif where
parseJSON (Object o) = do
x <- sequence $ map f (M.assocs o)
return $ Exif x
where
f (t, x) = do
y <- parseJSON x
return ((t, y) :: (T.Text, ExifValue))

parseExifFile = fmap parseExifData . B.readFile

parseExifData :: B.ByteString -> Data.Attoparsec.Result (Data.Aeson.Result [Exif])
parseExifData content = parse (fmap fromJSON json) content

测试文件:
[{
"SourceFile": "test.jpg",
"ExifTool:ExifToolVersion": 8.61,
"File:FileName": "test.jpg",
"File:FileSize": 2174179,
"File:FileModifyDate": "2011:07:27 16:53:49-07:00",
"File:FilePermissions": 644,
"File:FileType": "JPEG",
"File:MIMEType": "image/jpeg",
"File:ExifByteOrder": "MM",
"File:CurrentIPTCDigest": "32d6a77098a73aa816f2570c9472735a",
"File:ImageWidth": 2592,
"File:ImageHeight": 1936,
"File:EncodingProcess": 0,
"File:BitsPerSample": 8,
"File:ColorComponents": 3,
"File:YCbCrSubSampling": "2 2",
"XMP:Subject": ["alpha","beta","gamma"]
}]

最佳答案

您必须遵循 parseJSON 的类型沿着兔子的小路走一点点,但一旦你认出了(Array a)表示,应该是直截了当的。
parseJSON有类型 Value -> Parser a , 所以 (Array a)有类型 Value . Value 中的变体之一类型是 Array Array ,所以 a(Array a)必须是 Array 类型, 定义为 Vector Value . Value在里面 Vector是你想打电话的parseJSON继续返回您的列表,因此请查看 Vector 可以做什么.

最简单的方法可能是转换 a到列表 Vector.toList ,然后使用 mapM解析 Values .

或者,您可以避免使用 Vector通过更改您的 ExifArray 来列出转化持有的变体Vector ExifValue ,然后使用 Vector.mapM .

关于json - Haskell、Aeson 和 JSON 解析成自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6930944/

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