Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is JSON.parse supposed to be recursive?

I am parsing a json string like so:

ring = JSON.parse(response);

Now, ring is an object but ring.stones is just a string when it should be an object as well.

If I call:

ring.stones = JSON.parse(ring.stones);

It is now the correct object.

I didn't know if this is correct behavior or if maybe I have an issue somewhere stopping it from parsing recursively? If it is supposed to parse recursively, are there any known issues that would prevent it?


Update

Here is the full response before parsing:

{"ring_id":"9","stone_count":"4","style_number":"style 4","syn10":"436.15","gen10":"489.39","syn14":"627.60","gen14":"680.85","available":"yes","type":"ring","engravings_count":"0","engravings_char_count":"0","engravings_band":"10","stones":"[{\"stone_id\":\"27\",\"ring_id\":\"9\",\"stone_shape\":\"round\",\"stone_x\":\"132.80\",\"stone_y\":\"114.50\",\"stone_width\":\"71.60\",\"stone_height\":\"71.60\",\"stone_rotation\":\"0.00\",\"stone_number\":\"1\",\"stone_mm_width\":\"5.00\",\"stone_mm_height\":\"5.00\"},{\"stone_id\":\"28\",\"ring_id\":\"9\",\"stone_shape\":\"round\",\"stone_x\":\"100.50\",\"stone_y\":\"166.20\",\"stone_width\":\"36.20\",\"stone_height\":\"36.60\",\"stone_rotation\":\"0.00\",\"stone_number\":\"2\",\"stone_mm_width\":\"2.50\",\"stone_mm_height\":\"2.50\"},{\"stone_id\":\"29\",\"ring_id\":\"9\",\"stone_shape\":\"round\",\"stone_x\":\"200.20\",\"stone_y\":\"105.10\",\"stone_width\":\"33.90\",\"stone_height\":\"33.90\",\"stone_rotation\":\"0.00\",\"stone_number\":\"3\",\"stone_mm_width\":\"2.50\",\"stone_mm_height\":\"2.50\"},{\"stone_id\":\"30\",\"ring_id\":\"9\",\"stone_shape\":\"round\",\"stone_x\":\"165.80\",\"stone_y\":\"82.50\",\"stone_width\":\"35.50\",\"stone_height\":\"33.90\",\"stone_rotation\":\"0.00\",\"stone_number\":\"4\",\"stone_mm_width\":\"2.50\",\"stone_mm_height\":\"2.50\"}]","images":"[{\"title\":\"white gold\",\"source\":\"Style4_4_W_M.png\"},{\"title\":\"yellow gold\",\"source\":\"Style4_4_Y_M.png\"}]"}


Update 2

Based on mikerobi's answer I was able to figure out what was happening:

Here is where I encoded it:

$row = $sth->fetch(PDO::FETCH_ASSOC);

$row['stones'] = getStones($ring_id);
$row['images'] = getRingVariations($ring_id);

return json_encode($row);

But the functions getStones and getRingVariations were returning json_encode'd strings. I needed to change them to return plain strings.

like image 349
JD Isaacks Avatar asked Nov 03 '10 19:11

JD Isaacks


People also ask

Does JSON parse work recursively?

It is of course completely valid to parse out a string completely recursively, exactly as it is written in the grammar. Finally, a JSON string must contain a value at it's top level. A value is one of the items in the value section of the grammar, such as an object, array, string, or boolean.

Is JSON parse asynchronous?

The difference is: json() is asynchronous and returns a Promise object that resolves to a JavaScript object. JSON. parse() is synchronous can parse a string to (a) JavaScript object(s).

Is JSON parsed automatically?

The json auto operator automatically detects where the JSON object is located and parses it.

How is JSON data parsed?

JSON parsing is the process of converting a JSON object in text format to a Javascript object that can be used inside a program. In Javascript, the standard way to do this is by using the method JSON. parse() , as the Javascript standard specifies.


2 Answers

Your JSON structure is wrong, it is wrapping stones in quotes, turning it into a string.

Your JSON looks like:

{
    stones: "[{\"stone_id":\"27\"},{\"stone_id\":\"27\"}]"
}

It should look like:

{
    stones: [{"stone_id": 27},{"stone_id": 27}]
}

EDIT

It appears you are converting all values to string, including numbers, I updated my example to reflect this.

Also, I'm guessing by the output that you are writing your own code to serialize the JSON, I highly recommend using an existing library.

like image 183
mikerobi Avatar answered Oct 21 '22 13:10

mikerobi


It is recursive, but your input string (response) is not in correct format. Get rid of those escape characters (\") and try again.

like image 29
Maksim Vi. Avatar answered Oct 21 '22 13:10

Maksim Vi.