Регулярка для JSON-строки
Есть ли регулярное выражение для проверки того, что строка - данные в JSON?
После полу часа поисков, нашёл эту функцию: function isJSONString(string) { try { if(typeof object !== "string") { throw new Error(''); } JSON.parse(string); return true; } catch(e) { return false; } }; , но, я надеюсь, можно это сделать через регулярку? Пытался написать сам, но не знаю что делать с валидацией. Моё выражение искало по парным скобкам и первому слову (как {"test"} и ["test"]), но не гарантировало валидности дальше, да и являлось страшно вырвиглазным: var myReg = /^([\{|\[]*".+"[[:|,]{1}.*[\}|\]]]?)$/; alert(myReg.test('["test", false, {}]') // true, но... alert(myReg.test('["test", {ololo} invalid]')) // true! . Всё-равно, будет ли проверка происходить через exec (возвратит всю строку), или через test. Пример: alert(isJSONString.test('justString')) // false alert(isJSON.test('["just","Array"]')) // true Спасибо :з |
Нахуя?
|
Ты вобще вкурсе что следующие литералы - тоже JSON?
alert([JSON.parse('true'), JSON.parse('null'), JSON.parse('14.6')]); |
danik.js,
предположим, что мне нужно только для объектов и массивов. |
2chan, забей. Это не реально.
|
try { data=JSON.parse(data); } catch (e) {} // ну это и единственный способ, можно еще написать лексер.
|
Sweet, реально, но в несколько проходов\рекурсивно.
Само собой только в качестве бреда.) Вот например набросок регулярки для объекта в json: /\{(?:\s*".*?(?=([^\\](?:\\\\)*"))\1\s*:\s*(?:".*?(?=([^\\](?:\\\\)*"))\2|null|false|true|(?:-?\d+|\d*\.\d+)(?:e[+-]?\d+)?)\s*,)*\s*".*?(?=([^\\](?:\\\\)*"))\3\s*:\s*(?:".*?(?=([^\\](?:\\\\)*"))\4|null|false|true|(?:-?\d+|\d*\.\d+)(?:e[+-]?\d+)?)\s*\}/g |
а как же escape-последовательности?
|
Sweet,
реально. Aetae это доказал. |
Аркадий Укупник, м? С ними всё в порядке. Вот только моя регулярка не ищет пустые строки. Я помню что как-то это когда-то решал, но сейчас думать лень, а кода под рукой нет.)
|
Часовой пояс GMT +3, время: 09:57. |