Я вижу много ссылок на "сжатый JSON", когда речь идет о разных форматах сериализации. Что это такое? Это просто gzipped JSON или что-то еще?
Что такое "сжатый JSON"?
Ответ 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"}]