2010-11-17 11 views
12

Widzę wiele odniesień do "skompresowanego JSON", jeśli chodzi o różne formaty serializacji. Co to dokładnie jest? Czy to po prostu Gzip JSON czy coś innego?Co to jest "skompresowany JSON"?

Odpowiedz

20

skompresowane JSON usuwa klucz: pary wartości kodowania JSON do przechowywania kluczy i wartości w oddzielnych równoległych tablic:

// 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' ] 
}; 

Taki sposób użytkowania znalazłem tutaj

Zawartość z linkiem (http://www.nwhite.net/?p=242)

rzadko znajduję się w miejscu, w którym piszę aplikacje javascript, które używają AJAX w czystej postaci. Dawno porzuciłem "X" i zastąpiłem go "J" (JSON). Podczas pracy z Javascriptem po prostu ma sens zwrócenie JSON. Mniejsze rozmiary, łatwiejsze analizowanie i łatwiejsza struktura to wszystkie zalety, które zdobyłem od czasu użycia JSON.

W ostatnim projekcie nie byłem zadowolony z dużego rozmiaru zestawów wyników. Dane, które zwróciłem, to dane tabelaryczne, w postaci obiektów dla każdego wiersza. Zwróciłem zestaw wyników 50, z 19 polami. Uświadomiłem sobie, że jeśli zwiększę swój zestaw wyników, mogę uzyskać kompresję.

// nieskompresowany

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

// sprężone

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

I połączył wszystkie moje wartości w jednej tablicy i przechowywać wszystkie swoje pola w oddzielnej tablicy. Zwrócenie pary klucz-wartość dla każdego wyniku kosztowało mnie 8800 bajtów (8,6 KB). Zgrywanie pól i umieszczanie ich w osobnej tablicy kosztowało mnie 186 bajtów. Całkowite oszczędności 8,4kb.

Teraz mam znacznie bardziej skompresowany plik JSON, ale struktura jest inna, a teraz trudniej z nią pracować. Dlatego zaimplementowałem rozwiązanie w Mootools, aby dekompresja była przejrzysta.

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){} 
}); 

Przepuścić tyle przedmiotów, ile chcesz, aby nadmuchać tablicę. Ma ona opcjonalną właściwość o nazwie "sklep". Jeśli ustawiono, zawyżony zestaw danych zostanie zapisany w tym kluczu.

"Klucze" i "pola" oczekują ciągów pasujących do lokalizacji w katalogu głównym obiektu JSON.

+0

ten dostaje mój upvote czy można dodać cytat ... nigdy nie słyszałem o tym wcześniej i brzmi całkiem fajne. – Domenic

+1

Coś wartego uwagi w artykule, komentator "Isaac Schlueter" udowadnia poprzez porównanie, że ta metoda jest mniej wydajna niż samo używanie gzip, chociaż autor zauważa, że ​​nie wszystkie przeglądarki akceptują gzip. – Seanny123

+0

Oba łącza są teraz nieczynne. Czy są jakieś biblioteki, które to wspierają? – Nisarg

0

Najbardziej prawdopodobną odpowiedzią jest to, że naprawdę jest to tylko zgnieciony JSON. Nie ma innego standardowego znaczenia tego wyrażenia.

Ponowna organizacja jednorodnej tablicy obiektów JSON w parę tablic jest bardzo przydatną techniką zmniejszania obciążenia i przyspieszania kodowania i dekodowania, nie jest powszechnie nazywana "skompresowanym JSON". Nie natknąłem się na niego nigdy w otwartym kodzie źródłowym ani żadnym otwartym API, ale używamy tej techniki wewnętrznie i nazywamy ją "jsontable".

1

siedzibą w odpowiedzi Paniyar, możemy przekonwertować Lista obiektów w „skompresowany” Json formatu przy użyciu C# tak:

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

Kiedyś tablicę obiektu ponieważ pola może być int, bool, string ...

Więcej Redukcja: Jeśli pole jest powtarzany bardzo często i jest to typ string, można uzyskać sprężone trochę bardziej, jeśli dodać odrębną listę tej dziedzinie ... na przykład, nazwa pola stanowisko pracy, miasto itp. są dla tego znakomitym kandydatem. Możesz dodać odrębną listę tych pozycji i dla każdej pozycji zmień wartość dla numeru referencyjnego. To sprawi, że twój Json będzie lite.

0

Compressed:

[["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"]] 

nieskompresowany:

[{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"}]