我使用了强烈推荐的Aeson软件包,但我需要解析整数。我想做类似的事情:
decode "5" :: Maybe Int
并获取结果,但正如文档中解释的那样(http://hackage.haskell.org/package/aeson-0.8.0.0/docs/Data-Aeson.html),Aeson不支持解析简单类型(好主意!):
>>> decode (encode (1 :: Int)) :: Maybe Int
Nothing
你引用了使用值解析器而不是json解析器,但是没有指示如何实际使用该解析器。如果你看一下解码的来源,你会发现内部的Aeson有一个decodeWith选项,它接受一个解析器,但这对你来说是隐藏的。似乎导入Data.Attoparsec并运行parse value "5"
可能会有效,但我也无法从中获得有意义的结果。
答案 0 :(得分:3)
这不起作用,因为JSON不支持1
作为有效的JSON文档,唯一有效JSON的顶级值是对象和数组。您可以通过在值周围放置方括号并将其解码为Int
的列表来轻松解决此问题:
> decode "[1]" :: Maybe [Int]
Just [1]
decode
函数仅将JSON文档转换为Haskell值,而不仅仅是将JSON值转换为Haskell值。您可以在json
下的文档中看到这一点:
解析顶级JSON值。根据RFC 4627,它必须是对象或数组。
但是,要使用value
和Data.Attoparsec
实际使用Data.Aeson.Parser
解析器:
> parseOnly value "1"
Right (Number 1.0)
通过简单的模式匹配,您可以将该值提取为Data.Scientific.Scientific
值,Aeson将其用作数值类型。