字符串化对象时如何防止数字上的字符串化?

时间:2012-02-10 09:26:58

标签: javascript json node.js

我正在node.js编写一个API,它从数据库中提取数据,对其进行操作,然后将其发送给消费者。

我有一个看起来像这样的对象:

{
    2734899508: "Chicken",
    2843594878: "Fish"
}

当我调用JSON.stringify并传递上述对象时,我得到了这个:

{
    "2734899508": "Chicken",
    "2843594878": "Fish"
}

我想要一个字符串,其中数字键不会变成字符串。我该怎么做?

3 个答案:

答案 0 :(得分:1)

数字作为对象键不受支持,它们将被转换为字符串键,你有数字幻觉我猜是因为当你做myObj [2843594878]时它会返回正确的值,但是在访问器上它也是转换这到一个字符串。

您可以在序列化之前通过以下方式验证:

console.log(typeof(Object.keys(myObj)[0]));

答案 1 :(得分:1)

引用JSON syntax您会发现这些数字键实际上是来自string: value对的字符串。解析器很宽松并将它们转换为string

作为对象表示法,无论如何,您的标识符是一个数字有点奇怪,例如,如果您有一个对象myFridge,它将等同于:

myFridge.2734899508 = "Chicken" // WRONG

但是,您仍然可以使用括号语法,正如其他人指出的那样:

myFridge["2734899508"] = "Chicken"

您可以考虑使用数组之类的其他内容来严格保存数字,例如:

{
fridgeItems:
[ 
  [ 2734899508, "Chicken" ],
  [ 2843594878, "Fish" ]
]
}

可能会更好地代表您的数据。

答案 2 :(得分:0)

您可以测试每个键/值是否为字符串化整数:

if(parseInt(value)==value) {
    value = parseInt(value);
}

注意:在这里有意使用==而不是===,因为我们想要将两者强制为字符串。

但是,如果您知道哪些键/值是字符串化的整数,那么您可以只做中间线来修复它们。

我想指出,如果你将这个json发送到浏览器或其他javascript客户端,除非你总是使用===,否则你是否有一个int或一个字符串并没有什么区别。