让Aeson处理混合类型列表

时间:2014-10-22 19:18:57

标签: haskell aeson

这有效:

λ 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"]

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

更新

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

我猜这好一点。我仍然希望我能让Aeson将所有内容强制转换为字符串,但我想我可以使用它。

1 个答案:

答案 0 :(得分:7)

FromJSON的标准Text实例不会执行您正在寻找的那种强制行为。幸运的是,aeson足够灵活,可以让您使用自己的规则定义自己的类型。这是一个例子,complete on FP Haskell Center。它的主要部分是:

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"