Haskell 让Aeson处理混合类型列表

Haskell 让Aeson处理混合类型列表,haskell,aeson,Haskell,Aeson,这项工作: λ decode "[\"one\", \"two\"]" :: Maybe [Text] Just ["one","two"] λ decode "[1, 2]" :: Maybe [Int] Just [1,2] 这项工作: λ decode "[\"one\", \"two\"]" :: Maybe [Text] Just ["one","two"] λ decode "[1, 2]" :: Maybe [Int] Just [1,2] 这是完全有效的JSON,但我无法

这项工作:

λ decode "[\"one\", \"two\"]" :: Maybe [Text]
Just ["one","two"]
λ decode "[1, 2]" :: Maybe [Int]
Just [1,2]
这项工作:

λ decode "[\"one\", \"two\"]" :: Maybe [Text]
Just ["one","two"]
λ decode "[1, 2]" :: Maybe [Int]
Just [1,2]
这是完全有效的JSON,但我无法使其工作:

λ decode "[\"one\", 2]" :: Maybe [Text]
Nothing
甚至:

λ decode "[2]" :: Maybe [Text]
Nothing
我想说服最后一位给我:

Just ["one","2"]
Just ["2"]
但是,我看不出有什么办法可以把埃森的手臂扭曲成它想看到的数字,而不是字符串

更新:

λ decode "[1, \"2\"]" :: Maybe Array
Just (fromList [Number 1.0,String "2"])

我想这样会好一点。我仍然希望能够让Aeson将所有内容强制转换为字符串,但我想我可以这样做。

用于
文本的标准
FromJSON
实例不会执行您正在寻找的强制。幸运的是,
aeson
足够灵活,可以让您用自己的规则定义自己的类型。这里有一个例子。它的主要部分是:

newtype LaxText = LaxText Text
    deriving Show

instance FromJSON LaxText where
    parseJSON (String t) = return $ LaxText t
    parseJSON (Number n) = return $ LaxText $ toStrict $ toLazyText $ scientificBuilder n
    parseJSON _ = fail "Invalid LaxText"