如何使用Haskell" json"要解析的包类型[Map String String]?

时间:2016-01-18 06:45:49

标签: json haskell

我有一些像这样的样本JSON数据:

[{
  "File:FileSize": "104 MB",
  "File:FileModifyDate": "2015:04:11 10:39:00-07:00",
  "File:FileAccessDate": "2016:01:17 22:37:23-08:00",
  "File:FileInodeChangeDate": "2015:04:26 07:50:50-07:00"
}]

我尝试使用json包解析数据(不是aeson):

import qualified Data.Map.Lazy as M
import Text.JSON

content <- readFile "file.txt"
decode content :: Result [M.Map String String]

这给了我一个错误:

Error "readJSON{Map}: unable to parse array value"

我可以达到这个目的:

fmap 
  (map (M.fromList . fromJSObject)) 
  (decode content :: Result [JSObject String])

但这似乎是一种非常手动的方式。当然,JSON数据可以直接解析为[Map String String]类型。指针?

1 个答案:

答案 0 :(得分:1)

如果没有MAP_AS_DICT切换,JSON (MAP a b)实例将为:

instance (Ord a, JSON a, JSON b) => JSON (M.Map a b) where
  showJSON = encJSArray M.toList
  readJSON = decJSArray "Map" M.fromList

因此只能将JSON数组解析为Data.Map,否则它将调用mkError并终止。

由于haskell对实例的限制,您将无法自己为JSON (Map a b)编写实例,因此您当前的解决方法可能是最佳解决方案。