从HttpBuilder迁移至HttpBuilder-NG:获取原始JSON及Jackson解析方案
解决HttpBuilder-NG获取原始JSON并通过Jackson解析为POJO的问题
我最近刚把旧HttpBuilder脚本迁移到HttpBuilder-NG 1.0.3,遇到了和你一模一样的问题:框架默认会把JSON响应自动解析成LazyMap,没法直接拿到原始JSON字符串用Jackson转成POJO。试了各种方法后,终于通过自定义响应解析器搞定了,下面是完整的可运行实现代码:
完整工作代码
import groovyx.net.http.HttpBuilder import com.fasterxml.jackson.databind.ObjectMapper // 初始化HttpBuilder-NG基础配置 def http = HttpBuilder.configure { request.uri = "http://${proxy}.domain.ie" request.headers["Accept"] = "application/json" request.headers["Cookie"] = "token=${token}" } // 发送GET请求并处理响应 def queues = http.get { request.uri.path = "/blah/plugins/blah/queues" // 自定义application/json响应解析器,获取原始JSON字符串 response.parser('application/json') { cfg, fs -> // 直接从输入流读取未解析的原始文本 return fs.inputStream.text } response.success { fs, String rawJson -> LOGGER.info("GET queues request succeeded, HTTP ${fs.statusCode}") // 用Jackson将原始JSON解析为目标POJO数组 ObjectMapper objectMapper = new ObjectMapper() return objectMapper.readValue(rawJson, Queue[].class) } response.failure { fs -> LOGGER.info("GET queues request failed, HTTP ${fs.statusCode}") return null } }
关键细节说明
- 移除了旧代码里的
request.contentType = TEXT配置,因为我们要完全接管JSON的解析逻辑,不需要框架默认的文本处理流程 - 核心是
response.parser('application/json')这个自定义解析器,它直接从FromServer对象的输入流中读取原始JSON文本,彻底绕过了框架默认的LazyMap自动解析 - 在
response.success回调中,我们拿到的已经是纯净的原始JSON字符串,直接传给Jackson的ObjectMapper就能生成对应的Queue对象数组了
这个方案完全符合HttpBuilder-NG的官方规范,亲测在1.0.3版本中可以稳定运行。
内容的提问来源于stack exchange,提问作者alexnanrick
相关产品推荐
相关产品推荐

