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

Grails/Groovy通过$.getJSON获取JSON时数字小数点丢失问题

解决方案:Grails控制器传递坐标JSON至前端丢失小数点问题

这个问题我之前碰到过类似的,大概率是Float类型的特性或者Grails的JSON序列化逻辑导致的,咱们一步步来排查解决:

问题根源分析

你在控制器里把经纬度转成了Float类型,但Float是单精度浮点数,精度有限(仅6-7位有效数字),而且Grails的JSON转换器在处理Float时,可能会出现序列化异常,导致前端解析后数值丢失小数点。另外,虽然你觉得控制器返回的格式正确,但建议先通过浏览器开发者工具查看网络请求的响应内容,确认实际返回的JSON里lat/lon的真实值——有时候肉眼看的“正确”可能存在偏差。

具体解决方案

1. 替换Float为Double/保留原始数值类型

地理位置坐标需要更高的精度,Float完全满足不了需求,而且容易引发序列化问题。修改控制器代码,去掉as Float或者换成as Double:

def eventsJson = {
    def list = []
    events.each { event ->
        list.push([
                name: event?.name as String
                // 去掉Float转换,直接用原始数值(如果是BigDecimal/Double类型)
                ,lat:  event?.place?.latitude
                ,lon:  event?.place?.longitude
                // 如果原始是字符串类型,转成Double更可靠
                // ,lat:  event?.place?.latitude ? Double.parseDouble(event.place.latitude) : null
                // ,lon:  event?.place?.longitude ? Double.parseDouble(event.place.longitude) : null
        ])
    }
    // 明确指定contentType为application/json,避免前端解析错误
    render(contentType: "application/json", text: list as JSON)
}

2. 确保JSON渲染的Content-Type正确

有时候Grails默认的渲染可能没有正确设置Content-Type,导致jQuery解析JSON时出现异常。在render方法里明确指定contentType: "application/json",能保证前端以正确的方式解析响应内容。

3. 调试验证

修改后,用浏览器开发者工具的“网络”标签,查看event/eventsJson请求的响应体,确认lat/lon是否是带小数点的正确数值。同时在前端alert(item.lon)时,也能看到正确的数值了。

额外提示

如果你的经纬度原始数据是字符串类型,一定要用Double.parseDouble()来转换,不要用Float——Float的精度缺陷会导致坐标偏移,对于地图应用来说这是致命的。

内容的提问来源于stack exchange,提问作者NKuehnel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:19:10