Подтвердить что ты не робот

Что такое "сжатый JSON"?

Я вижу много ссылок на "сжатый JSON", когда речь идет о разных форматах сериализации. Что это такое? Это просто gzipped JSON или что-то еще?

4b9b3361

Ответ 1

Сжатый JSON удаляет пару ключей: значение json-кодирования для хранения ключей и значений в отдельных параллельных массивах:

// uncompressed
JSON = {
  data : [
     { field1 : 'data1', field2 : 'data2', field3 : 'data3' },
     { field1 : 'data4', field2 : 'data5', field3 : 'data6' },
     .....
  ]
};

//compressed
JSON = {
    data : [ 'data1','data2','data3','data4','data5','data6' ],
    keys : [ 'field1', 'field2', 'field3' ]
};

Этот метод использования, который я нашел здесь

Контент со ссылкой (http://www.nwhite.net/?p=242)

редко нахожусь в месте, где я пишу javascript-приложения, которые используют AJAX в чистом виде. Я давно отказался от "Х" и заменил его "J (JSON). При работе с Javascript имеет смысл вернуть JSON. Меньшая занимаемая площадь, более простой анализ и более простая структура - все преимущества, которые я получил с помощью JSON.

В недавнем проекте я оказался недоволен большим размером моих результирующих наборов. Данные, которые я возвращал, были табличными данными в виде объектов для каждой строки. Я возвращал результирующий набор из 50, по 19 полей. Я понял, что если я увеличу свой набор результатов, я мог бы получить форму сжатия.

//несжатый

JSON = {
  data : [
     { field1 : 'data1', field2 : 'data2', field3 : 'data3' },
     { field1 : 'data4', field2 : 'data5', field3 : 'data6' },
     .....
  ]
};

//сжат

JSON = {
    data : [ 'data1','data2','data3','data4','data5','data6' ],
    keys : [ 'field1', 'field2', 'field3' ]
};

Я объединил все мои значения в один массив и сохранил все мои поля в отдельном массиве. Возврат пары значений ключа для каждого результата стоил мне 8800 байт (8.6kb). Вырывание полей и помещение их в отдельный массив стоили мне 186 байт. Общая экономия 8,4 тыс. Фунтов.

Теперь у меня есть гораздо более сжатый JSON файл, но структура отличается и теперь сложнее работать. Поэтому я реализую решение в Mootools, чтобы сделать декомпрессию прозрачной.

Request.JSON.extend({

    options : {
        inflate : []
    }

});




Request.JSON.implement({

    success : function(text){
        this.response.json = JSON.decode(text, this.options.secure);
        if(this.options.inflate.length){
            this.options.inflate.each(function(rule){
                var ret = ($defined(rule.store)) ? this.response.json[rule.store] : this.response.json[rule.data];
                ret = this.expandData(this.response.json[rule.data], this.response.json[rule.keys]);
            },this);
        }
        this.onSuccess(this.response.json, text);
    },

    expandData : function(data,keys){
        var arr = [];
        var len = data.length; var klen = keys.length;
        var start = 0; var stop = klen;
        while(stop < len){
            arr.push( data.slice(start,stop).associate(keys) );
            start = stop; stop += klen;
        }
        return arr;
    }

});

Request.JSON now has an inflate option. You can inflate multiple segments of your JSON object if you so desire.

Usage:

new Request.JSON({
       url : 'url',
       inflate : [{ 'keys' : 'fields', 'data' : 'data' }]
       onComplete : function(json){}
});

Пропускайте столько раздутых объектов, сколько хотите, чтобы раздувать массив. Он имеет необязательное свойство, называемое хранилищем. Если установлено, что накаченный набор данных будет сохранен в этом ключе.

Поля "keys and" ожидают, что строки будут соответствовать местоположению в корне вашего объекта JSON.

Ответ 2

На основе ответа Paniyar мы можем преобразовать Список объектов в "сжатом" Json формате с использованием С#, например:

var JsonString = serializer.Serialize(
new
{
    cols = new[] { "field1", "field2", "field3"},
    items = data.Select(x => new object[] {x.field1, x.field2, x.field3})
});

Я использовал массив объектов, потому что поля могут быть int, bool, string...

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

Ответ 3

Наиболее вероятным ответом является то, что на самом деле это просто gzipped JSON. Для этой фразы нет другого стандартного значения.

Повторная организация однородного массива объектов JSON в пару массивов - очень полезный метод, позволяющий уменьшить полезную нагрузку и ускорить кодирование и декодирование, его обычно не называют "сжатым JSON". Я не сталкивался с ним когда-либо в open source или любом открытом API, но мы используем этот метод внутри себя и называем его "jsontable".

Ответ 4

Сжатый:

[["KeyA", "KeyB", "KeyC", "KeyD", "KeyE", "KeyF"],
["ValA1", "ValB1", "ValC1", "ValD1", "ValE1", "ValF1"],
["ValA2", "ValB2", "ValC2", "ValD2", "ValE2", "ValF2"],
["ValA3", "ValB3", "ValC3", "ValD3", "ValE3", "ValF3"],
["ValA4", "ValB4", "ValC4", "ValD4", "ValE4", "ValF4"]]

несжатый:

[{KeyA: "ValA1", KeyB: "ValB1", KeyC: "ValC1", KeyD: "ValD1", KeyE: "ValE1", KeyF: "ValF1"},
{KeyA: "ValA2", KeyB: "ValB2", KeyC: "ValC2", KeyD: "ValD2", KeyE: "ValE2", KeyF: "ValF2"},
{KeyA: "ValA3", KeyB: "ValB3", KeyC: "ValC3", KeyD: "ValD3", KeyE: "ValE3", KeyF: "ValF3"},
{KeyA: "ValA4", KeyB: "ValB4", KeyC: "ValC4", KeyD: "ValD4", KeyE: "ValE4", KeyF: "ValF4"}]