如何将Data.Aeson.Types.Value解码为Haskell坐标类型或元组
从嵌套JSON中提取Coords类型或Double元组的方法
你已经通过http-conduit和lens-aeson拿到了包含坐标的Maybe Value,下面两种方案可以实现你的需求:
方案一:用已定义的Coords类型解析
如果你已经为Coords实现了FromJSON实例,最简洁的方式是用lens-aeson提供的_JSON prism,直接在你的path链末尾添加它,就能自动完成类型转换:
request <- parseRequest uri response <- httpJSON request let jsonValue = getResponseBody response :: Value let path = key "result" . key "addressMatches" . nth 0 . key "coordinates" . _JSON -- 自动将Value解析为Coords类型 let coords = preview path jsonValue :: Maybe Coords print coords
如果已经拿到了coordsValue :: Maybe Value,也可以用parseMaybe手动解析:
import Data.Aeson (parseMaybe) -- 假设已经有coordsValue = preview path jsonValue let coords = coordsValue >>= parseMaybe parseJSON :: Maybe Coords
方案二:提取为(Double, Double)元组
如果不需要自定义类型,直接用lens的组合提取x和y值:
方式1:整合到path链中
用to把提取逻辑转换成Getter,嵌入到原path里:
request <- parseRequest uri response <- httpJSON request let jsonValue = getResponseBody response :: Value let path = key "result" . key "addressMatches" . nth 0 . key "coordinates" . to (\obj -> (,) <$> preview (key "x" . _Double) obj <*> preview (key "y" . _Double) obj) let coordsTuple = preview path jsonValue :: Maybe (Double, Double) print coordsTuple
方式2:分开处理已有的Maybe Value
如果已经拿到了coordsValue,可以用do表达式组合两个预览结果:
let coordsValue = preview path jsonValue let coordsTuple = do obj <- coordsValue x <- preview (key "x" . _Double) obj y <- preview (key "y" . _Double) obj return (x, y)
这里的_Double是lens-aeson提供的prism,专门用于从Value中提取Double类型的数值,只要JSON里的x/y是数字类型就能匹配成功。
内容的提问来源于stack exchange,提问作者Leo U.
相关产品推荐
相关产品推荐

