Aeson:“当期待一个字符串时,遇到了一个对象”

时间:2014-02-06 14:03:36

标签: json haskell aeson

我对Haskell相当新,所以我想错过一些简单的东西。现在,我只是尝试从stdin中读取一些JSON,并将AST作为概念证明返回。

module JSONStuff where

import qualified Data.Aeson as JSON
import qualified Data.ByteString.Lazy.Char8 as Char

main :: IO ()
main = do
    input <- Char.getContents
    case JSON.eitherDecode input of
        Left err -> putStrLn $ "Bad JSON: " ++ err
        Right value -> do
            putStrLn "Got:"
            putStrLn value

我有这个JSON片段(JSONLint说没问题):

{
  "foo": 123
}

当我使用该输入的程序时,我得到:

$ cat examples/object.json | runhaskell Main.hs
Bad JSON: when expecting a String, encountered Object instead

当我测试一个空数组的文件时,它说它“遇到了数组”。

所以我猜我在这里缺少某种转换步骤,或者我正在从stdin中错误地读取。你觉得怎么样?

1 个答案:

答案 0 :(得分:6)

问题在于这一行:

putStrLn value

由于putStrLn的类型为String -> IO (),因此value的类型推断为String,因此将使用字符串的FromJSON实例,这将只解码字符串,因为这是类型可以处理的。要解码其他内容,您需要value的其他类型。

尝试

print (value :: JSON.Object)

如果你期望一个对象,或

print (value :: JSON.Value)

如果任何JSON值可以接受。

请注意使用print代替putStrLnprint接受具有Show实例的任何类型,因此与putStrLn不同,它不会强制其参数为字符串。另请注意,没有类型注释的print value在此示例中不起作用,因为编译器没有足够的信息来推断value应该具有哪种类型,因此ShowFromJSON要使用{{1}}个实例。