Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   JSON.parse не парсит (https://javascript.ru/forum/jquery/53233-json-parse-ne-parsit.html)

Amadey15 26.01.2015 03:13

JSON.parse не парсит
 
Всем доброго времени суток, не могу распарсить строку:
[{"id":"main_table_dff","config":"[{\"meta_key\": \"ewe\", \"name\": \"rdsg\", \"type\": 1}]"}]
Онлайн парсеры справляются с ней без проблем. Можете подсказать как её изменить что бы правильно распарсить?
Строка приходит с сервера через AJAX и формируется JSONConector-ом, config берётся с БД, так что поменять строку на сервере хлопотно и лучше менять из этой средствами js. Ошибка возникает из-за "config":"[{\"meta_key\": \"ewe\", \"name\": \"rdsg\", \"type\": 1}]", устраняется заменой \" на \' или просто ', но это тоже не вариант, т.к. конфиг в последствии тоже нужно парсить.

danik.js 26.01.2015 03:56

Зачем у тебя конфиг идет строкой? Передавай
[{"id":"main_table_dff","config":[{"meta_key": "ewe", "name": "rdsg", "type": 1}]}]
и не надо ничего городить.

Amadey15 26.01.2015 05:07

Цитата:

Сообщение от danik.js (Сообщение 353477)
Зачем у тебя конфиг идет строкой? Передавай
[{"id":"main_table_dff","config":[{"meta_key": "ewe", "name": "rdsg", "type": 1}]}]
и не надо ничего городить.

Потому что конфиг хранится в базе данных в виде строки, итоговая строка формируется на сервере JSONDataConnector-ом, там отредактировать строку у меня не очень вышло, более того ваш вариант тоже не хочет парситься:
JSON.parse("[{"id":"main_table_dff","config":{"meta_key": "ewe", "name": "rdsg", "type": 1}]}]")
Uncaught SyntaxError: Unexpected identifier

danik.js 26.01.2015 05:15

Цитата:

Сообщение от Amadey15
JSONDataConnector

Не знаю че это. Но думаю это косяк. И исправлять его лучше на сервере, а клиенту подать уже готовое блюдо.
Цитата:

Сообщение от Amadey15
тоже не хочет парситься

Я вручную правил, допустил ошибку - скобок закрывающих чета много )

Amadey15 26.01.2015 05:35

Скобки все на месте,JSONDataConector - не думаю что на столько плох, да и разбирать конфиг на сервере будет куда сложнее и дольше чем распарсенный на клиенте, да и нет гарантии что клиент сможет правильно распарсить отредактированную на сервере строку (ваш пример верный и онлайн парсеры очень даже хорошо его парсят, но JSON.parser не справляется).
Может есть другие парсеры для JS? В том что эту строку реально правильно распарсить я не сомневаюсь, как пример могу привести datatable из библиотеки webix, он без проблем обрабатывает подобные запросы сформированные JSONDataConector-ом, вот только его встроенный парсер я не нашёл.

danik.js 26.01.2015 06:02

Строка отлично парсится. Надо только уяснить как работает экранирование в строках:

var data = '[{"id":"main_table_dff","config":"[{\\"meta_key\\": \\"ewe\\", \\"name\\": \\"rdsg\\", \\"type\\": 1}]"}]'
alert(JSON.parse(data))


config - это строка с двойными кавычками, поэтому все двойные кавычки внутри нее нам надо экранировать слэшем. Однако эта строка у нас записана внутри другой строки - data, c одиночными кавычками. И чтобы эта строка (data), не схавала наши слэшы (это ведь спецсимвол), мы его экранируем. Но это только при записи нашей строки в коде. Если сделаешь console.log(data), то разумеется двойных слэшей ты не увидишь.

В общем, либо ты неправильно проверяешь, либо у тебя на сервере формируешь строку неправильным путем.

Amadey15 26.01.2015 06:04

Немного поменяю вопрос: Как распарсить строку:
[{"id":"main_table_dff","config":[{"meta_key": "ewe", "name": "rdsg", "type": 1}]}]

Эту строку получить из строки в первом сообщении не сложно, проблема в том что JSON.parse даже с ней не справляется, хотя всего один валидатор из 8 первых выданных гуглом, забраковал строку:
Цитата:

{
"valid": false,
"critical": "Invalid JSON - not an an object object"
}

danik.js 26.01.2015 06:07

Цитата:

Сообщение от Amadey15
JSON.parse даже с ней не справляется

Нех пиздеть!
var data = '[{"id":"main_table_dff","config":[{"meta_key": "ewe", "name": "rdsg", "type": 1}]}]'
alert(JSON.parse(data))


И вобще - че за бред - справляется, не справляется? Есть спецификация JSON. Если текст соответствует специкации - он будет без проблем распарсен. Если в нем ошибки - тут уж извиняй, ты сам виноват..

Amadey15 26.01.2015 06:08

каким браузером вы пользуетесь? Хром и яндекс выдают [object Object]

danik.js 26.01.2015 06:10

Цитата:

Сообщение от Amadey15
каким браузером вы пользуетесь?

Какая разница? Браузером, в котором есть объект JSON. Выдает, естественно [object Object] - результат приведения к строке через вызовы [{}.toString()].toString() :
alert([{}.toString()].toString())


Часовой пояс GMT +3, время: 08:30.