gpt4 book ai didi

haskell - 在 Aeson 中解析嵌套数组

转载 作者:行者123 更新时间:2023-12-03 19:15:09 24 4
gpt4 key购买 nike

我正在努力使用 Aeson 库解析以下 JSON。
我只对获取 file1 感兴趣,但我似乎无法管理它。
有人有什么建议吗?

JSON

{"files":[["file1.wav",["file2.jpg","file3.jpg"]]]}

我的代码

data File = File Text deriving (Show, Generic, ToJSON)

instance FromJSON File where
parseJSON jsn = do
arrays <- parseJSON jsn
let x = arrays !! 0 !! 0
return $ File x

错误信息

"Error in $.files[0][1]: parsing Text failed, expected String, but encountered Array"

最佳答案

问题是使用parseJSONjsn 解析为同类 列表。但是 "file1.wav" 是一个字符串而 ["file2.jpg", "file3.jpg"] 不是一个字符串。

一个简单的解决方案是直接在 json 上进行模式匹配,这是一个 Value它可以包含异构的 Array(尽管它的名称如此,但它实际上是 vector 库中的 Vector 的同义词)。

{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import qualified Data.Vector as V
import Data.Text (Text)

newtype File = File Text deriving Show

instance FromJSON File where
parseJSON json = do
Array arr <- pure json
Just (Array arr0) <- pure (arr V.!? 0)
Just (String txt) <- pure (arr0 V.!? 0)
pure (File txt)

main :: IO ()
main = print (decode' "[[\"file1\", [\"file2\", \"file3\"]]]" :: Maybe File)

( (!?) is a safe indexing operator. )

关于haskell - 在 Aeson 中解析嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61028312/

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