我们可以解码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"])]))]))])
那么我们只需要对包裹在`Object构造函数中的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
然后我们获得一个包裹在Maybe 中的Map String String(因为解码和处理都可能出错,使用Maybe 可能更好),它将Strings 映射到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 作为值是否是您想要的,因为现在无法“查看”该值并检查该元素内部的内容。此外,如果您想要进行大量查找,当您想要检查两个 Texts 是否相同时,Text 通常会快一个数量级。