我有一个问题,我必须通过POST调用获得JSON。
我实际上必须比较两个包含JSON部分的签名字符串。让我们说他们就像:
val signature = "someText+" + Json.stringify(jsonValue) + "+anotherText"
我所拥有的2个签名应该是相似的,但我从request请求得到jsonValue
。其小数被删除0(如12.0
变为12
)所以签名是不同。
有没有办法避免小数删除?谢谢!
答案 0 :(得分:2)
这是JSON的“正常”行为,因为JSON标准中12.0和12之间没有区别。
数字:带符号的十进制数,可能包含小数部分和 可以使用指数E表示法,但不能包含非数字表示法 NaN的。格式不区分整数和 浮点。 JavaScript使用双精度浮点 所有数值的格式,但实现其他语言 JSON可能会对数字进行不同的编码。
所以你不需要打扰你将要发送的内容12.0或12,因为在JSON中没有像“integer”或“float”这样的东西。下一步的下一次转换可能会再次触发它。
<强>更新强>
你说你需要它来生成签名。 有人会检查这个签名,并且有人也可以将这个JSON转换为某些类型并返回(为什么不呢?就像你这样做),并且可能会收到不同的结果。不同但正确。这里的要点是你不能使用JSON来生成签名(它不仅仅是数字,它只是其中的一个)。你做的事情 - 你使用String来创建签名,而不是JSON。
现在关于字符串,您需要获取原始请求正文。在斯卡拉:
def index = Action(parse.tolerantText) { request =>
val jsonAsString = request.body
}
答案 1 :(得分:1)
好的,我试着查看Play正文解析器,parse.tolerantText
做了强制将json转换为字符串的作业,小数点在这里:)