Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.10.2014, 19:57
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

Регулярка для 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

Спасибо :з

Последний раз редактировалось 2chan, 28.10.2014 в 20:36. Причина: Добавление деталей...
Ответить с цитированием
  #2 (permalink)  
Старый 28.10.2014, 20:55
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Нахуя?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 28.10.2014, 20:58
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Ты вобще вкурсе что следующие литералы - тоже JSON?
alert([JSON.parse('true'), JSON.parse('null'), JSON.parse('14.6')]);
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 28.10.2014, 21:17
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

danik.js,
предположим, что мне нужно только для объектов и массивов.
Ответить с цитированием
  #5 (permalink)  
Старый 28.10.2014, 21:42
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

2chan, забей. Это не реально.
Ответить с цитированием
  #6 (permalink)  
Старый 28.10.2014, 22:23
Аватар для Аркадий Укупник
Аспирант
Отправить личное сообщение для Аркадий Укупник Посмотреть профиль Найти все сообщения от Аркадий Укупник
 
Регистрация: 06.09.2014
Сообщений: 41

try { data=JSON.parse(data); } catch (e) {} // ну это и единственный способ, можно еще написать лексер.

Последний раз редактировалось Аркадий Укупник, 28.10.2014 в 22:27.
Ответить с цитированием
  #7 (permalink)  
Старый 28.10.2014, 22:24
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

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
__________________
29375, 35

Последний раз редактировалось Aetae, 28.10.2014 в 22:30.
Ответить с цитированием
  #8 (permalink)  
Старый 28.10.2014, 22:54
Аватар для Аркадий Укупник
Аспирант
Отправить личное сообщение для Аркадий Укупник Посмотреть профиль Найти все сообщения от Аркадий Укупник
 
Регистрация: 06.09.2014
Сообщений: 41

а как же escape-последовательности?
Ответить с цитированием
  #9 (permalink)  
Старый 28.10.2014, 23:49
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

Sweet,
реально. Aetae это доказал.
Ответить с цитированием
  #10 (permalink)  
Старый 29.10.2014, 00:59
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

Аркадий Укупник, м? С ними всё в порядке. Вот только моя регулярка не ищет пустые строки. Я помню что как-то это когда-то решал, но сейчас думать лень, а кода под рукой нет.)
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Подскажите технологию для реализации. sektor-sumy Общие вопросы Javascript 3 11.04.2013 23:49
Регулярка для комментариев /* comment */ , опционально закрытых danik.js Общие вопросы Javascript 4 12.01.2013 03:24
Jquery, Dynatree и JSON antirek jQuery 6 01.09.2009 15:00