JSON数值序列化问题:不同记法数值为何生成相同JWT Base64串
JSON数值序列化规则说明
官方规范依据
当前JSON格式的正式官方标准是RFC 8259,其中关于数值序列化的相关规定如下:
- JSON语法层面同时支持定点数值表示(如
0.000001)和科学计数法表示(如1.0e-6),二者属于语义完全等价的数值 - 规范未强制要求JSON序列化器保留原始输入的数值表示格式,仅要求序列化生成的数值经过解码后,与原始数值的数学值相等即可
- 语义等价的不同数值表示,在序列化后输出为同一种格式完全符合标准要求
对应现象的原理
你观察到两个不同数值表示的payload生成相同Base64编码,是因为:
- 平台底层调用的JSON序列化库会对语义等价的数值做统一格式输出,你给出的两个payload:
{ "value": 0.000001 }
{ "value": 1.0e-6 }
经过序列化后生成的JSON字符串完全一致,对应的Base64编码eyJ2YWx1ZSI6MC4wMDAwMDF9自然完全相同
- 两个payload序列化后的统一输出为
{"value":0.000001},和你解码得到的结果一致
非正式行业参考规则
目前主流编程语言的JSON序列化库基本遵循通行的实现约定:
- 对于浮点数,当数值大小处于
1e-6到1e21区间内时,默认采用定点格式输出,超出该区间时才会自动转为科学计数法输出 - 所有序列化实现的核心原则都是优先保证数值语义等价,不会为了保留原始输入格式破坏数值一致性
- 如果你有特殊需求要保留原始的数值表示形式,只能将数值以字符串类型存储在JSON中,无法通过数值类型实现
内容的提问来源于stack exchange,提问作者igobivo
相关产品推荐
相关产品推荐

