Json Haskell-Aeson解析混合元素数组

Json Haskell-Aeson解析混合元素数组,json,parsing,haskell,aeson,Json,Parsing,Haskell,Aeson,我有一个类似的json: { "name" : "Sam", "items": [ "sword", "shield", [] ] } 和数据类型 data Adventurer = Adventurer { name :: String, items :: [String] } deriving (Generic, Show, FromJSON, ToJSON) 问题的原因是“items”字段在数组中有额外的[],而我得到的是“expected String,expecte

我有一个类似的json:

{
  "name" : "Sam",
  "items": [ "sword", "shield", [] ]
}
和数据类型

data Adventurer = Adventurer {
  name :: String,
  items :: [String]
} deriving (Generic, Show, FromJSON, ToJSON)
问题的原因是“items”字段在数组中有额外的[],而我得到的是“expected String,expected array”

我一直在尝试使用“items”数组元素的自定义数据类型来解决这个问题,或者尝试创建一个自定义解析器来忽略额外的数组


有没有一种方法可以解析一个数组,只取某一类型的项,而不取其他项?

是的,例如,我们可以首先构造一个函数,将
s(这些是JSON对象)映射到
可能的字符串
s:

import Data.Aeson(Value(String))
import Data.Text(unpack)

getString :: Value -> Maybe String
getString (String t) = Just (unpack t)
getString _ = Nothing
然后,我们可以为
Adventurer
定义
FromJOSN
的自定义实现,如:

{-# LANGUAGE OverloadedStrings #-}

import Data.Aeson(FromJSON(parseJSON), withObject, (.:))
import Data.Maybe(catMaybes)

instance FromJSON Adventurer where
    parseJSON = withObject "Adventurer" $ \v -> Adventurer
        <$> v .: "name"
        <*> fmap (catMaybes . map getString) (v .: "items")
Main> t = "{\n  \"name\" : \"Sam\",\n  \"items\": [ \"sword\", \"shield\", [] ]\n}"
Main> decode t :: Maybe Adventurer 
Just (Adventurer {name = "Sam", items = ["sword","shield"]})