2012-12-30 6 views
24

diese JSON Antwort Bedenken Sie:Gibt es eine bekannte Methode zum Trocknen von JSON

[{ 
    Name: 'Saeed', 
    Age: 31 
}, { 
    Name: 'Maysam', 
    Age: 32 
}, { 
    Name: 'Mehdi', 
    Age: 27 
}] 

Dies funktioniert für kleine Datenmenge in Ordnung, aber wenn Sie größere Datenmengen dienen wollen (sagen viele tausend Datensätze für Beispiel), scheint es logisch, diese Wiederholungen von Eigenschaftsnamen in der Antwort JSON irgendwie zu verhindern.

Ich googelte das Konzept (DRYing JSON) und zu meiner Überraschung fand ich kein relevantes Ergebnis. Eine Möglichkeit, natürlich ist JSON zu komprimieren, mit einem einfachen hausgemachten Algorithmus und entpacken Sie es auf der Client-Seite vor dem Genuss es:

[['Name', 'Age'], 
['Saeed', 31], 
['Maysam', 32], 
['Mehdi', 27]] 

jedoch eine bewährte Methode wäre besser als jeder Entwickler versucht, das Rad neu zu erfinden . Habt ihr eine bekannte, allgemein akzeptierte Lösung dafür gesehen?

+0

JSON ist eine Datenstruktur, so dass es nicht trocken fallen. – JJJ

+7

Die Redundanz in dieser Art von JSON komprimiert sehr gut, wenn gzip verwendet wird. Das wussten Sie wahrscheinlich schon, aber nur für den Fall, dass festgestellt wird, dass es keine allgemein akzeptierte Technik zum Schreiben kompakter JSON-Dokumente gibt, ist dies wahrscheinlich der Grund. :) –

+2

Ihre "hausgemachte" Idee ist ein guter Anfang. Suchen Sie stattdessen nach "JSON-Komprimierung". Dort finden Sie verschiedene Ideen wie [HPack] (http://stackoverflow.com/questions/11774375/json-compression-for-transfer). – DCoder

Antwort

7

Sie können eine CSV-Format anstelle von JSON verwenden können, wie Sie nur die Eigenschaftsnamen einmal angeben würde. Dies würde jedoch eine starre Struktur wie in Ihrem Beispiel erfordern.

JSON ist nicht wirklich die Art von Ding, die sich für DRY eignet, da es bereits recht gut verpackt ist, wenn man bedenkt, was man damit machen kann. Persönlich habe ich nackte Arrays für JSON-Daten verwendet, die in einer Datei zur späteren Verwendung gespeichert werden, aber für einfache AJAX-Anfragen lasse ich sie einfach so, wie sie ist.

DRY bezieht sich normalerweise auf das, was Sie selbst schreiben. Wenn Ihr Objekt also dynamisch generiert wird, sollten Sie sich nicht darum kümmern.

16

Zunächst einmal soll JSON nicht die kompakteste Art der Datenrepräsentation sein. Es soll direkt in eine JavaScript-Datenstruktur zerlegt werden können, die für den sofortigen Gebrauch ohne weitere Analyse ausgelegt ist. Wenn Sie die Größe optimieren möchten, möchten Sie wahrscheinlich JSON nicht selbst beschreiben und Sie müssen Ihrem Code erlauben, eine Reihe von Annahmen darüber zu treffen, wie die Daten behandelt und verwendet werden sollen, und beim Empfänger manuell zu analysieren Ende. Es sind diese Annahmen und zusätzliche Programmierarbeiten, die Ihnen Speicherplatz sparen.

Wenn die Eigenschaftsnamen und das Format der Antwort des Servers bereits auf den Code bekannt sind, können Sie zurückkehren nur die Daten als eine Reihe von alternierenden Werten:

['Saeed', 31, 'Maysam', 32, 'Mehdi', 27] 

oder wenn es sicher ist, anzunehmen, dass Name don ‚t Kommata enthalten, könnten Sie sogar zurückkehren nur ein Komma getrennte Zeichenfolge, die Sie in sie Stücke geteilt konnte und bleiben in Ihre eigene Datenstrukturen:

"Saeed, 31, Maysam, 32, Mehdi, 27" 

oder wenn Sie noch wollen, dass es gültig JSON sein, können Sie setzen diese Zeichenfolge in einem Array wie diesem, das nur leicht ist tly besser als meine erste Version, in der die Elemente selbst sind Array-Elemente:

["Saeed, 31, Maysam, 32, Mehdi, 27"] 

Diese Annahmen und Kompaktheit mehr der Verantwortung stellen, um die Daten auf Ihrem eigenen Javascript-Parsing, aber es ist, dass die Entfernung der selbstbeschreibenden Natur Der vollständige JSON, mit dem Sie begonnen haben, führt zu seiner kompakteren Natur.

+1

Es ist erwähnenswert, dass das letzte Beispiel kein JSON-Dokument ist, da JSON-Dokumente ein Array oder eine Map als Root-Objekt haben müssen. –

+0

@DietrichEpp - guter Punkt - Ich habe eine Option hinzugefügt, bei der die Zeichenfolge auch in ein Array eingeschlossen ist. Die Auswahl zwischen diesen Optionen hängt davon ab, wie sehr das OP bei legalem JSON bleiben oder die übertragenen Bytes optimieren möchte. – jfriend00

5

Verwenden Sie gzip-Komprimierung, die in der Regel problemlos in die meisten Webserver & Clients eingebaut werden kann?

Es dauert noch einige (zusätzliche) Zeit & Speicher zu erzeugen & parsen Sie die JSON an jedem Ende, aber es wird nicht so lange dauern, um über das Netzwerk zu senden, und wird minimale Implementierungsaufwand in Ihrem Namen.

Vielleicht ist es einen Versuch wert, selbst wenn Sie Ihre Quelldaten irgendwie vorkomprimieren.

1

Es ist eigentlich kein Problem für JSON, dass Sie oft eine massive String- oder "Property" -Duplizierung haben (auch nicht für XML).

Das ist genau, was die duplicate string elimination Komponente des DEFLATE-Algorithmus adressiert (von GZip verwendet).

Während die meisten Browser-Clients GZip-komprimierte Antworten akzeptieren können, wird der Datenverkehr zum Server nicht wiederhergestellt.

Gewährleistet das "JSON-Komprimierung" (d. H. hpack oder ein anderes Schema)?

  1. Es ist unwahrscheinlich, viel schneller zu sein als GZIP-Kompression in Javascript Umsetzung (was nicht unmöglich ist, auf einer einigermaßen schnelle Maschine, die Sie 100 KB in 250 ms komprimieren können).

  2. Es ist ziemlich schwierig, nicht vertrauenswürdige JSON-Eingaben sicher zu verarbeiten. Sie müssen das Stream-basierte Parsing verwenden und sich für einen maximalen Komplexitätsschwellenwert entscheiden, sonst könnte Ihr Server eine Überraschung erleben. Siehe zum Beispiel Armin Ronacher Start Writing More Classes:

    Wenn Ihr netter kleinen Web-Server 10000 Anfragen eines zweiten Durch GEVENT bekommen, sondern mit json.loads dann kann ich es wahrscheinlich zum Stillstand kriecht, indem es 16MB gut gestaltetes Senden und verschachtelte JSON, die all Ihre CPU wegschleudern.

Verwandte Themen