Groovy/Grails中HTTPBuilder无法自动解析JSON,求正确配置方法
解决Groovy HTTPBuilder自动解析UPS API JSON的问题
环境
- Groovy 2.4.14
- Grails 2.5.6
- JVM 1.8
- MacOS
问题详情
调用UPS API获取运单跟踪信息时,API返回Content-Type: application/json格式的JSON字符串,但HTTPBuilder未自动解析响应,反而返回一个异常的HashMap:
{ "JSON stuff": null }
目前只能通过JSON.parse(data.keySet()[0])手动解析得到可用结构,尝试设置Accept请求头为JSON也无效。
解决方案
问题根源在于HTTPBuilder的请求配置错误,调整以下两点即可实现自动解析:
指定正确的响应内容类型
将http.request(Method.GET, ContentType.URLENC)中的第二个参数改为ContentType.JSON,该参数用于告知HTTPBuilder你期望的响应格式,框架会自动匹配并解析对应类型的响应。移除不必要的请求体类型配置
GET请求通常没有请求体,因此删除requestContentType = ContentType.URLENC这行配置,该参数仅用于POST/PUT等带请求体的请求。
修改后的核心代码
def trackingGroup(String tracking) { def result; try { HTTPBuilder http = new HTTPBuilder(urlbase) http.request(Method.GET, ContentType.JSON) { req -> uri.path = "/api/track/v1/shipment/details/${tracking}"; headers['Authorization'] = "Bearer ${TOKS.getToken()}" headers['User-Agent'] = "Me"; headers['Accept'] = ContentType.JSON; headers['transId'] = "testing" headers['transactionSrc'] = "testing" response.success = { resp, json -> result = json // 此处json已为解析后的Groovy对象 } response.failure = { resp, json -> result = json } } } catch (error) { error.printStackTrace(); result = null } if (result == null) return "total failure"; // 移除手动解析的代码 List alltrack = []; result.trackResponse.shipment.each { shipment -> shipment.package.each { p -> alltrack << p.trackingNumber }; }; return alltrack; }
调整后,HTTPBuilder会自动将UPS返回的JSON响应解析为Groovy原生的Map/List结构,无需再手动处理原始JSON字符串。
内容的提问来源于stack exchange,提问作者Pointy
相关产品推荐
相关产品推荐

