JSON.parse должен быть рекурсивным? - PullRequest
6 голосов
/ 03 ноября 2010

Я анализирую строку json следующим образом:

ring = JSON.parse(response);

Теперь ring - это объект, но ring.stones - это просто строка, когда он также должен быть объектом.

Если я позвоню:

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

Теперь это правильный объект.

Я не знал, является ли это правильным поведением или, может быть, у меня возникла проблема, мешающая рекурсивному анализу? Если он должен анализироваться рекурсивно, есть ли известные проблемы, которые могли бы его предотвратить?


Обновление

Вот полный ответ перед разбором:

{"ring_id": "9", "stone_count": "4", "style_number": "style 4", "syn10": "436.15", "gen10": "489.39", "syn14": " 627,60" , "gen14": "680,85", "доступен": "да", "тип": "кольцо", "engravings_count": "0", "engravings_char_count": "0", "engravings_band": "10" , "камни": "[{\" stone_id \ ": \" 27 \», \ "ring_id \": \ "9 \", \ "stone_shape \": \ "круглый \", \ "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 \": \ "круглый \", \ "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 \": \ "круглый \", \ "stone_x \": \ "200,20 \", \ "stone_y \": \ "105,10 \", \ "stone_width \": \ "33.90 \", \» stone_height \ ": \" 33,90 \ "\ "stone_rotation \": \ "0,00 \", \" stone_numbe г \ ": \" 3 \ "\ "stone_mm_width \": \ "2.50 \", \ "stone_mm_height \": \ "2.50 \"}, {\ "stone_id \": \ "30 \", \" ring_id \ ": \" 9 \ "\ "stone_shape \": \ "круглый \", \ "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 \ ": \" желтое золото \ ", \" source \ ": \" Style4_4_Y_M.png \ "}]"}


Обновление 2

Основываясь на ответе Микероби, я смог выяснить, что происходит:

Вот где я его закодировал:

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

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

return json_encode($row);

Но функции getStones и getRingVariations возвращали json_encode строки. Мне нужно было изменить их, чтобы они возвращали простые строки.

Ответы [ 2 ]

6 голосов
/ 03 ноября 2010

Ваша структура JSON неверна, она заключает в кавычки камни, превращая их в строку.

Ваш JSON выглядит следующим образом:

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

Он должен выглядеть следующим образом:

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

РЕДАКТИРОВАТЬ

Похоже, вы конвертируете все значения в строку, включая числа, я обновил свой пример, чтобы отразить это.

Кроме того, я 'Я догадываюсь по выводу, что вы пишете свой собственный код для сериализации JSON, я настоятельно рекомендую использовать существующую библиотеку.

2 голосов
/ 03 ноября 2010

Это рекурсивно, но ваша входная строка (response) имеет неправильный формат. Избавьтесь от этих escape-символов (\") и попробуйте снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...