我正在尝试使用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)
});
});
});
我很难理解为什么它不会解析,但似乎有效。
编辑
我意识到,通过在layers
和layer1
周围加引号可以修复它,只是不确定为什么它能以这种方式工作,但不能以另一种方式工作。
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]}]}'
祝你好运!