在Haskell ghci中输入JSON文字的最简单方法

时间:2019-01-29 04:21:30

标签: json haskell

在将它们放入项目之前,我正在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实例定义完整的数据类型?

1 个答案:

答案 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