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
相关产品推荐
相关产品推荐

