Есть ли синтаксический анализатор / кодировщик для литералов объектов JavaScript без ограничений JSON? - PullRequest
3 голосов
/ 12 марта 2011

Ну, после «обсуждения» здесь:

https://stackoverflow.com/questions/5281903/java-json-parsers-whats-the-abusive-anal-thing-with-the-quote-marks-on-attribu

Существует ли синтаксический анализатор / декодер для литералов объектов JavaScript без ограничений JSON?

EDIT

В своем первоначальном посте я утверждал, что работаю с серверной частью Java. Я отметил это .net, потому что я пришел из .net фона и мог использовать их поддержку - и это оказалось правильным. Они знали, о чем я говорю, и со всем переносом между двумя языками - я надеялся услышать что-то новое.

Серверная часть Java должна как читать эту «облегченную» версию JSON, так и предоставлять ее. Так что это и парсер и энкодер. (Я исправил название, простите за путаницу)

1 Ответ

8 голосов
/ 12 марта 2011

Эта «оскорбительная анальная вещь с кавычками на именах атрибутов», как вы ее называете, является результатом решения Дугласа Крокфорда значительно упростить формат 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.Если кому-то будет интересно, пожалуйста, прокомментируйте.

В любом случае, это все еще только текстовый формат.Если вы перейдете в двоичную форму, вы получите лучшие результаты, особенно для больших чисел.Также, если у вас есть список предопределенных ключей, то легко использовать цифры для каждого из них.Если ключи - это числа, а значения - это числа, то они могут быть очень компактными в двоичном формате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...