在将它们放入项目之前,我正在ghci中测试一些功能,并且我正竭力寻找在ghci中输入json文字的最简单方法,而无需花很多时间
例如,我想尝试一下:
myFuncThatTakesAJson
输入
x = {}
y = {"a": 1}
但是当我尝试输入这些内容时:
import Text.JSON
Prelude> x = parseJSON "{}"
Prelude> y = parseJSON "{'a' : 1}"
我看到如下错误:
<interactive>:17:5: error:
Variable not in scope: parseJSON :: [Char] -> t
y = fromJSON "{'a' : 1}"
<interactive>:20:5: error:
Data constructor not in scope: FromJSON :: [Char] -> t
有什么方法可以将json对象作为字符串输入,而无需使用自定义的FromJSON实例定义完整的数据类型?
答案 0 :(得分:3)
肯定有!原始JSON值的类型为Value
。考虑到这一点,以下是在GHCi中构造Value
的几种方法:
和parseJSON
:由于Value
也有一个FromJSON
实例,因此可以在其上使用decode :: FromJSON a => ByteString -> Maybe a
。请注意,aeson
鼓励您使用ByteString
代替效率低下的默认String
。您可以通过打开-XOverloadedStrings
使字符串文字重载来掩饰此细节:
ghci> import Data.ByteString
ghci> import Data.Aeson
ghci> :set -XOverloadedStrings
ghci> x = decode "{}" :: Maybe Value
x :: Maybe Value
ghci> y = decode "{\"a\" : 1}" :: Maybe Value -- note: single quotes won't work
y :: Maybe Value
带有准引号:您还可以使用aesonQQ
准引号来获取编译时JSON文字(除了看起来更好之外,在REPL中这无关紧要,但在实际代码中,这意味着在运行时不进行任何实际解析):
ghci> import Data.Aeson.QQ.Simple
ghci> :set -XQuasiQuotes
ghci> x = [aesonQQ| {} |]
x :: Value
ghci> y = [aesonQQ| {"a" : 1} |]
y :: Value