1

我对 Haskell 相当陌生,所以我的意思是缺少一些简单的东西。现在,我只是想从标准输入中读取一些 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

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

所以我猜我在这里错过了某种转换步骤,或者我从标准输入错误地读取。你怎么看?

4

1 回答 1

7

问题是这一行:

putStrLn value

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

尝试

print (value :: JSON.Object)

如果您期望一个对象,或者

print (value :: JSON.Value)

如果任何 JSON 值是可接受的。

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

于 2014-02-06T14:13:59.993 回答