Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярка для JSON-строки (https://javascript.ru/forum/misc/51214-regulyarka-dlya-json-stroki.html)

2chan 28.10.2014 19:57

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

Спасибо :з

danik.js 28.10.2014 20:55

Нахуя?

danik.js 28.10.2014 20:58

Ты вобще вкурсе что следующие литералы - тоже JSON?
alert([JSON.parse('true'), JSON.parse('null'), JSON.parse('14.6')]);

2chan 28.10.2014 21:17

danik.js,
предположим, что мне нужно только для объектов и массивов.

Sweet 28.10.2014 21:42

2chan, забей. Это не реально.

Аркадий Укупник 28.10.2014 22:23

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

Aetae 28.10.2014 22:24

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

Аркадий Укупник 28.10.2014 22:54

а как же escape-последовательности?

2chan 28.10.2014 23:49

Sweet,
реально. Aetae это доказал.

Aetae 29.10.2014 00:59

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


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