2010-11-17 16 views
12

Vedo molti riferimenti a "JSON compresso" quando si tratta di diversi formati di serializzazione. Cosa è esattamente? È solo gzip JSON o qualcos'altro?Che cos'è "JSON compresso"?

risposta

20

compresso JSON rimuove la chiave: coppia di valori di codifica di json per memorizzare le chiavi e valori in file parallele separate:

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

Questo metodo di utilizzo ho trovato qui

contenuto da collegamento (http://www.nwhite.net/?p=242)

raramente mi trovo in un luogo in cui sto scrivendo applicazioni javascript che utilizzano AJAX nella sua forma pura. Ho abbandonato da tempo la 'X' e l'ho sostituita con 'J' (JSON). Quando lavori con Javascript, ha senso restituire JSON. Ingombro ridotto, analisi più semplice e struttura più semplice sono tutti vantaggi che ho acquisito da quando utilizzo JSON.

In un recente progetto mi sono trovato insoddisfatto delle grandi dimensioni dei miei set di risultati. I dati che stavo restituendo erano dati tabulari, sotto forma di oggetti per ogni riga. Stavo restituendo un set di risultati di 50, con 19 campi ciascuno. Quello che ho capito è che se aumentassi il mio set di risultati potrei ottenere una forma di compressione.

// non compresso

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

// compressa

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

ho fuso tutti i miei valori in un singolo array e memorizzare tutti i miei campi in un array separato. Restituire una coppia di valori chiave per ogni risultato mi è costata 8800 byte (8.6kb). Rippare i campi e metterli in un array separato mi è costato 186 byte. Risparmio totale 8.4kb.

Ora ho un file JSON molto più compresso, ma la struttura è diversa e ora è più difficile lavorare con. Quindi implemento una soluzione in Mootools per rendere trasparente la decompressione.

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

Passare il numero di oggetti di gonfiaggio desiderato nell'opzione di gonfiaggio dell'array. Ha una proprietà opzionale chiamata 'store' Se si imposta il set di dati gonfiati verrà invece memorizzato in quella chiave.

Le "chiavi" e i "campi" prevedono che le stringhe corrispondano a una posizione nella radice dell'oggetto JSON.

+0

Si ottiene la mia upvote se è possibile aggiungere una citazione ... mai sentito parlare prima e suona piuttosto fresco. – Domenic

+1

Qualcosa da notare dall'articolo, un commentatore "Isaac Schlueter" dimostra attraverso il confronto che questo metodo è meno efficiente di un semplice utilizzo di gzip, anche se l'autore nota che non tutti i browser accettano gzip. – Seanny123

+0

Entrambi i link sono morti ora. Ci sono delle librerie che supportano questo? – Nisarg

0

La risposta più probabile è che sia davvero solo gzip JSON. Non c'è altro significato standard per questa frase.

Ri-organizzare una matrice omogenea di oggetti JSON in una coppia di matrici è una tecnica molto utile per ridurre il carico utile e accelerare la codifica e la decodifica, non è comunemente chiamato "JSON compresso". Non l'ho mai incontrato in open source o API aperte, ma usiamo questa tecnica internamente e la chiamiamo "jsontable".

1

sede a risposta di Paniyar, possiamo convertire un elenco di oggetti in "compresso" JSON formato utilizzando C# in questo modo:

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

ho usato un array di oggetti perché i campi possono essere int, bool, string ...

Più di riduzione: Se il campo si ripete molto spesso ed è un tipo stringa, è possibile ottenere un po 'compresso essere più se si aggiunge una lista distinta di quel campo ... per esempio, un nome di campo posizione di lavoro, città, ecc sono eccellenti candidati per questo. È possibile aggiungere un elenco distinto di questi elementi e in ciascuna voce modificare il valore per un numero di riferimento. Ciò renderà il tuo Json più lite.

0

compressa:

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

non compresso:

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