You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:39:57