简体   繁体   中英

Creating object from JSON and parsing JSON - different results

I am trying to use JQuery to parse some JSON being sent back from an AJAX call. It appears to be failing to parse, and JSLint also says it's invalid JSON.

However, if I create the object directly, it works and I am able to loop through it - please see below:

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)
        });
    });
});

I'm struggling to wrap my head around why it won't parse, but appears to work.

Edit

I realise by wrapping quotes around layers and layer1 fixes it, just not sure why it works one way - but not the other.

there is a difference between javascript object and JSON object, all keys of JSON object must be quoted.

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.

so the correct JSON string will look like

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

If you change sometring to some of the following examples, it will works.

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

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

The reason for this is, basically, that's how JSON was specified.

For further examples, take a look at w3schools

Best practice is to use JSON.stringify(Object) on one side, and JSON.parse(String) on the other. This will save you many hours of scratching your head over some niggling detail.

In your example, you could resolve the problem by

var somestring = JSON.stringify(json)

For future reference, however, JSON keys must be quoted, so your somestring should be written as:

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

Good luck!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM