如何确保仅数字JSON密钥被解释为字符串而不是数字?

时间:2017-09-25 10:04:48

标签: javascript json safari

我有一个JSON String持有ID作为键,只有Strings个数字,实际NumbersFloat)作为值。解析它以获取对象在Safari 10.1.2 ...

中具有令人讨厌的效果



var myStr = "{\"53352\":0.6, \"82008\":0.4}";
var myStrParsed = JSON.parse(myStr);
console.log(myStrParsed);




...将导致以下解析对象:

{
  "0": NaN,
  "1": NaN,
  "2": NaN,
  "3": NaN,
  "4": NaN,
  "5": NaN,
  "6": NaN,
  "7": NaN,
  ...

当我真正期待以下内容时:

(在Firefox 55.0.3中执行)

 Object {53352=0.6, 82008=0.4}

(在Safari 11.0中执行)

{
  "53352": 0.6,
  "82008": 0.4
}

我知道从Safari获得的庞大阵列是由于Safari将String密钥误解为Number,这会产生一个索引高达82008的数组。当然,这不是预期的。如何确保Safari正确将密钥解释为Strings

到目前为止的方法

我可以让服务器在下划线作为前缀添加所有键,例如_53352而不是53352。这将解决问题,但我必须从客户端的密钥中删除下划线。整个方法感觉hacky和不一致,因为我没有将这个下划线附加到其他地方的ID。还有其他方法可以确保解释为String吗?

在服务器端使用org.json对JSON进行编码。

1 个答案:

答案 0 :(得分:0)

这是Safari 10.x中的已知错误

Bug 170442 - Safari 10.1 JSON.parse returns incorrect object for numeric keys with decimal values

根据@evolutionxbox,这个错误似乎已在第11版修复。