我对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中错误地读取。你觉得怎么样?
答案 0 :(得分:6)
问题在于这一行:
putStrLn value
由于putStrLn
的类型为String -> IO ()
,因此value
的类型推断为String
,因此将使用字符串的FromJSON
实例,这将只解码字符串,因为这是类型可以处理的。要解码其他内容,您需要value
的其他类型。
尝试
print (value :: JSON.Object)
如果你期望一个对象,或
print (value :: JSON.Value)
如果任何JSON值可以接受。
请注意使用print
代替putStrLn
。 print
接受具有Show
实例的任何类型,因此与putStrLn
不同,它不会强制其参数为字符串。另请注意,没有类型注释的print value
在此示例中不起作用,因为编译器没有足够的信息来推断value
应该具有哪种类型,因此Show
和FromJSON
要使用{{1}}个实例。