让Aeson处理混合类型列表

Mic*_*Fox 3 haskell aeson

这有效:

? decode "[\"one\", \"two\"]" :: Maybe [Text]
Just ["one","two"]
Run Code Online (Sandbox Code Playgroud)

这有效:

? decode "[1, 2]" :: Maybe [Int]
Just [1,2]
Run Code Online (Sandbox Code Playgroud)

这是完全有效的JSON,但我不能使它工作:

? decode "[\"one\", 2]" :: Maybe [Text]
Nothing
Run Code Online (Sandbox Code Playgroud)

甚至:

? decode "[2]" :: Maybe [Text]
Nothing
Run Code Online (Sandbox Code Playgroud)

我想说服最后一个给我:

Just ["one","2"]
Just ["2"]
Run Code Online (Sandbox Code Playgroud)

但我无法看到扭曲Aeson的手臂,看到它想要看到的数字作为字符串而不是.

更新:

? decode "[1, \"2\"]" :: Maybe Array
Just (fromList [Number 1.0,String "2"])
Run Code Online (Sandbox Code Playgroud)

我想这会好一些.我仍然希望我能让Aeson强迫所有的东西串起来,但我想我可以使用它.

Mic*_*man 8

标准FromJSON实例Text不会做你正在寻找的那种强制.幸运的是,aeson它足够灵活,可以让您使用自己的规则定义自己的类型.这是一个例子,在FP Haskell中心完成.它的主要部分是:

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"
Run Code Online (Sandbox Code Playgroud)