Ответ 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.