从JSON创建对象和解析JSON-不同的结果



我正在尝试使用JQuery来解析从AJAX调用返回的一些JSON。它似乎无法解析,JSLint还说它是无效的JSON。

然而,如果我直接创建对象,它就可以工作,并且我可以循环通过它——请参见下面:

var json = {layers:[{layer1:[17,16,15,14,12]}]}
alert(json)// <- This works and output object Object
var somestring = "{layers:[{layer1:[17,16,15,14,12]}]}"
var parsing = JSON.parse(somestring)
alert(parsing) // <- this doesn't and breaks on parse
// The below code will work provided the parsing is commented out
json.layers.forEach(function (outerObj)
{
Object.keys(outerObj).forEach(function (key)
{
outerObj[key].forEach(function (item)
{
alert(item)
});
});
});

我很难理解为什么它不会解析,但似乎有效。

编辑

我意识到,通过在layerslayer1周围加引号可以修复它,只是不确定为什么它能以这种方式工作,但不能以另一种方式工作。

javascript对象和JSON对象有区别,JSON对象的所有键都必须被引用。

var somestring = "{layers:[{layer1:[17,16,15,14,12]}]}"// not a valid json to parse, it is a normal string, you can use JSON.stringify() to make it a valid json identifiable string.

所以正确的JSON字符串看起来像

var somestring = '{"layers":[{"layer1":[17,16,15,14,12]}]}';
var parsedJson = JSON.parse(somestring)

如果将sometring更改为以下示例中的一些示例,它将起作用。

var somestring = '{"layers":[{"layer1":[17,16,15,14,12]}]}'
var somestring = "{"layers":[{"layer1":[17,16,15,14,12]}]}"

基本上,原因是JSON就是这样指定的。

有关更多示例,请查看w3schools

最佳实践是在一侧使用JSON.stringify(Object),在另一侧使用JSON.parse(String)。这将省去你为一些琐碎的细节而挠头的许多小时。

在您的示例中,您可以通过解决问题

var somestring = JSON.stringify(json)

但是,为了将来参考,必须引用JSON密钥,因此您的somestring应该写成:

var somestring = '{"layers":[{"layer1":[17,16,15,14,12]}]}'

祝你好运!

最新更新