我是一名哈斯克尔初学者。在Python中,我可以这样做:
>>> import json
>>> data = {'name': 'Jono', 'age': 36, 'skill': 'beginner'}
>>> json.dumps(data)
'{"name": "Jono", "age": 36, "skill": "beginner"}'
所以我试图在Haskell中做同样的事情。这是我尝试过的:
*Main Data.Aeson> myData = [("name", "Jono"), ("age", "36"), ("skill", "beginner")]
*Main Data.Aeson> toJSON myData
Array [Array [String "name",String "Jono"],Array [String "age",String "36"],Array [String "skill",String "beginner"]]
*Main Data.Aeson> encode $ toJSON myData
"[[\"name\",\"Jono\"],[\"age\",\"36\"],[\"skill\",\"beginner\"]]"
我无法输出JSON。我怎样才能做到这一点?我查看了有关Hackage的Data.Aeson文档,但我无法做出正面或反面。
答案 0 :(得分:8)
正如@felk所说,使用地图:
Prelude> import Data.Aeson
Prelude Data.Aeson> import Data.Map
Prelude Data.Aeson Data.Map> myData = fromList [("name", "Jono"), ("age", "36"), ("skill", "beginner")]
Prelude Data.Aeson Data.Map> encode $ toJSON myData
"{\"age\":\"36\",\"name\":\"Jono\",\"skill\":\"beginner\"}"
...> Data.ByteString.Lazy.Char8.putStrLn $ encode $ toJSON myData
{"age":"36","name":"Jono","skill":"beginner"}
答案 1 :(得分:8)
Python经常使用散列图作为轻量级数据结构。在Haskell中,数据类型足够轻量级,只需在需要时就可以创建一个。
{-# LANGUAGE TemplateHaskell #-}
import Data.Aeson
import Data.Aeson.TH
data Person = Person
{ name :: String
, age :: Int
, skill :: String -- you should probably use a more structured type here
}
deriveJSON defaultOptions ''Person
然后你可以使用它。无需先拨打toJSON
。
> encode Person { name = "Jono", age = 36, skill = "beginner" }
"{\"name\":\"Jono\",\"age\":36,\"skill\":\"beginner\"}"
(不要被额外的转义和引号标记所迷惑:这就是repl如何显示字符串y以避免歧义。显示的ByteString
确实是一个有效的JSON对象。)
这几乎与示例given at the beginning of the documentation相同;我鼓励你阅读那个页面,因为那里有很多很好的信息。