使用Aeson将JSON解析为映射字符串字符串

蛮力猫

我正在尝试从API解析具有如下数据结构的JSON

{
  "en": {
    "translation": {
      "name": "Name",
      "description": ["I am a", "en person"]
    }
  },
  "jp": {
    "translation": {
      "name": "JP Name",
      "description": ["I am a", "jp person"]
    }
  }
}

所以我只想将它们解析为newtype Translations = Map String String语言环境将是键名称,而值将只是JSON转换的字符串,例如,{"name": "Name", "description": ["I am a", en person"]}因为该值可能是任意复杂的,所以我很想/需要将其转换为其他Haskell数据结构。

我尝试了很多方法来编写适合的书parseJSONTranslation但仍然做不到。

任何帮助,将不胜感激!

威廉·范昂塞姆

我们可以用解码ByteString

Prelude Data.Aeson Bs Hm Mp Tx> decode text :: Maybe Object
Just (fromList [("jp",Object (fromList [("translation",Object (fromList [("name",String "JP Name"),("description",Array [String "I am a",String "jp person"])]))])),("en",Object (fromList [("translation",Object (fromList [("name",String "Name"),("description",Array [String "I am a",String "en person"])]))]))])

因此,我们只需要HashMap Text Object在对象构造函数中包装的对象上执行映射

import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as Bs
import qualified Data.HashMap.Lazy as Hm
import qualified Data.Map as Mp
import qualified Data.Text as Tx

process :: Value -> Maybe (Mp.Map String String)
process (Object m) = Just ((Mp.fromList . map f) (Hm.toList m))
    where f (x, y) = (Tx.unpack x, Bs.unpack (encode y))
process _ = Nothing

然后,我们获得一个Map String String包装在中的s Maybe(由于两种解码方式都可能导致处理出错,因此最好使用Maybe),将映射String到上String

Prelude Data.Aeson Bs Hm Mp Tx> decode text >>= process
Just (fromList [("en","{\"translation\":{\"name\":\"Name\",\"description\":[\"I am a\",\"en person\"]}}"),("jp","{\"translation\":{\"name\":\"JP Name\",\"description\":[\"I am a\",\"jp person\"]}}")])

话虽这么说,我不确定JSON Blob是否是您想要的值,因为现在无法“查看”该值并检查该元素内部的内容。此外,如果您要进行大量查找,Text则当您要检查两个Texts是否相同时通常快一个数量级

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章