Play框架JSON解析如何保留小数末尾零?
Play框架解析JSON时保留小数格式问题
我需要解析一段JSON字符串后保留原有的小数格式(比如2.0不能被转为2),但使用Play框架默认解析逻辑时出现了格式丢失的情况:
示例代码
import play.api.libs.json._ val jsonString = """{"value":2.0}""" println(jsonString) println(Json.parse(jsonString))
当前输出
{"value":2.0} {"value":2}
期望输出
{"value":2.0} {"value":2.0}
解决方法
Play框架默认的JSON解析器会将2.0这类可转换为整数的小数解析为整数类型的JsNumber,导致输出时丢失小数后缀。你可以通过以下两种方式解决:
1. 全局自定义JSON解析器设置
通过JsonParserSettings自定义数字解析逻辑,强制所有数字以浮点数类型解析:
import play.api.libs.json._ import play.api.libs.json.JsonParserSettings // 配置解析器,将所有数字字符串转为Double类型的JsNumber val customParserSettings = JsonParserSettings().withNumberParser { numStr => scala.util.Try(numStr.toDouble).map(JsNumber(_)) } val jsonString = """{"value":2.0}""" println(jsonString) // 使用自定义设置解析JSON val parsedJson = Json.parse(jsonString, customParserSettings) println(parsedJson)
2. 针对特定字段自定义格式化器
如果只需要处理特定字段,可以定义对应的数据类和自定义Format,强制字段类型为Double:
import play.api.libs.json._ case class Data(value: Double) // 自定义Format,确保序列化时保留小数格式 implicit val dataFormat: Format[Data] = new Format[Data] { override def reads(json: JsValue): JsResult[Data] = (json \ "value").validate[Double].map(Data(_)) override def writes(data: Data): JsValue = Json.obj("value" -> JsNumber(data.value)) } val jsonString = """{"value":2.0}""" val parsedData = Json.parse(jsonString).validate[Data].get println(Json.toJson(parsedData))
以上两种方式都能让解析后的JSON输出保留2.0这样的小数格式。
内容的提问来源于stack exchange,提问作者codeMouse
相关产品推荐
相关产品推荐

