Эта «оскорбительная анальная вещь с кавычками на именах атрибутов», как вы ее называете, является результатом решения Дугласа Крокфорда значительно упростить формат JSON и сделать написание парсеров JSON намного проще .
Помните, что в JavaScript вы не можете называть свои ключи объектов: break, case, catch, class, const, continue, отладчик, default, delete, do, else,enum, export, extends, false, наконец, для, функции, если реализует, импортировать, в, instanceof, интерфейсе, let, new, null, package, private, protected, public, return, static, super, switch, this,throw, true, try, typeof, var, void, while, with и yield, если они не заключены в кавычки.
Кроме того, любой ключ, который не является допустимым идентификатором JavaScript, должен быть заключен в кавычки.
Когда вы реализуете свой «менее анальный» кодировщик и синтаксический анализатор литералов объектов JavaScript, не забудьте сделать для них исключения, иначе у вас не будет даже действительных литералов объектов JavaScript .
UPDATE:
Если вы не хотите использовать кавычки в своих ключах, потому что вы так обеспокоены накладными расходами сетевого трафика при использовании кавычек, что вы предпочитаете использовать собственные JSON-подобные кодировщики и парсеры, которые не будутиспользуйте кавычки вместо стандартных и проверенных библиотек JSON (как я понимаю из ваших комментариев), тогда, возможно, вам не следует использовать JSON в первую очередь .
Возможно, попробуйте какой-нибудь двоичный форматнапример, SDXF (RFC 3072 - формат обмена структурированными данными) или BSON (двоичный JSON, двоично-кодированная сериализация JSON-подобных документов) или свернуть свой собственный двоичный файл формат, потому что удаление кавычек из JSON не займет у вас много времени (возможно, максимум 1% для gzip-переводов).
ОБНОВЛЕНИЕ 2:
Если я правильно понимаю вашу ситуацию, то у вас есть JSONданные как этот:
[{"a":1,"b":2,"c":3,"d":4},null,null,{"a":9,"b":10,"c":11,"d":12}]
Это 66 байтов.Преобразовать его в обычный литерал объекта JavaScript это может быть:
[{a:1,b:2,c:3,d:4},,,{a:9,b:10,c:11,d:12}]
Теперь это 42 байта.(Имейте в виду, что обработка висячих запятых несовместима между браузерами - например, [1,,2,,]
- это массив 4 -элементов в Firefox и, вероятно, 5-элементный массив в IE.)
Но это не все, что вы можете сделать.Вы можете удалить двоеточия, фигурные скобки и запятые в объектах:
a1b2c3d4,,,a9b10c11d12
Теперь это 22 байта.Речь идет о половине версии без кавычек и одной трети версии с кавычками, и ее все равно легко разобрать.Если у вас плоская структура данных, это может подойти вам.Я назову этот новый формат, который я только что изобрел CFON для обозначения компактных плоских объектов.
Вы можете преобразовать его в JSON, используя такой код:
var inp = input.split(','),
out = [], i, j, m, p, output;
for (i = 0; i < inp.length; i++) {
if (inp[i]) {
out[i] = {};
m = inp[i].match(/[a-z]+\d+/ig);
for (j = 0; j < m.length; j++) {
p = /([a-z]+)(\d+)/i.exec(m[j]);
out[i][p[1]] = p[2];
}
}
}
output = JSON.stringify(out);
См. CFON → JSON DEMO .
И вы можете конвертировать JSON в этот небольшой формат, используя такой код:
var inp = JSON.parse(input),
out = [], i, k, output;
for (i = 0; i < inp.length; i++) {
out[i] = '';
if (inp[i]) {
for (k in inp[i]) {
if (inp[i].hasOwnProperty(k)) {
out[i] += k + inp[i][k];
}
}
}
}
output = out.join(',');
См. JSON → CFON DEMO.
Теперь, когда я думаю об этом, я мог бы добавить поддержку десятичных дробей и создать библиотеку CFON.Если кому-то будет интересно, пожалуйста, прокомментируйте.
В любом случае, это все еще только текстовый формат.Если вы перейдете в двоичную форму, вы получите лучшие результаты, особенно для больших чисел.Также, если у вас есть список предопределенных ключей, то легко использовать цифры для каждого из них.Если ключи - это числа, а значения - это числа, то они могут быть очень компактными в двоичном формате.