2012-12-30 11 views
24

このJSON応答を考えてみましょう:は、任意の周知の方法は、乾燥JSONのためにあるの

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

これは、少量のデータのために正常に動作しますが、あなたは大量のデータを提供したいとき(のための何千ものレコードを言います例えば、レスポンスJSONのプロパティ名の繰り返しが何らかの形で起こらないようにするのは理にかなっているようです。

私はグーグル・コンセプト(JSYをDRYしています)を驚かせましたが、関連する結果は見つかりませんでした。もちろん、一つの方法は、単純なホームメイドのアルゴリズムを使用してJSONを圧縮し、それを消費する前に、クライアント側でそれを解凍することです:

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

ただし、ベストプラクティスは車輪の再発明しようとしている各開発者よりも良いだろう。あなたはこれについてよく知られている広く受け入れられている解決策を見ましたか?

+0

JSONはデータ構造であるため、DRYに該当しません。 – JJJ

+7

gzipを使用すると、この種のJSONに固有の冗長性が非常によく圧縮されます。あなたはすでにそれを知っていたでしょうが、コンパクトなJSON文書を書くために一般に認められている技術が存在しないことが判明した場合には、おそらくこれが原因です。 :) –

+2

あなたの「自家製」アイデアは良いスタートです。代わりに「JSack圧縮」を検索すると、[HPack](http://stackoverflow.com/questions/11774375/json-compression-for-transfer)などのいくつかのアイデアが見つかります。 – DCoder

答えて

10

一つの解決策は、あなたが一度だけのプロパティ名を指定すると同じように、JSONの代わりにCSV形式を使用することができるかもしれませんhpackアルゴリズム

https://github.com/WebReflection/json.hpack/wiki

7

として知られています。しかし、これはあなたの例のような堅い構造を必要とします。

JSONは実際にあなたがそれを使って何をすることができるかを考慮して、すでにかなりパッケージ化されているので、DRYに役立つものではありません。個人的には、後で使用するためにファイルに格納されるJSONデータのベア配列を使用しましたが、単純なAJAXリクエストではそのままそのまま残しています。

DRYは通常自分が書いたものを指しますので、オブジェクトが動的に生成されている場合は、とにかくそれを心配する必要はありません。

16

まず、JSONはデータを表現する最もコンパクトな方法ではありません。これは、解析することなく直ちに使用できるように設計されたjavascriptデータ構造に直接解析できることを意味します。サイズを最適化したい場合は、JSONの自己記述が望ましくない可能性があります。データを処理して使用するためのコードをたくさん作成し、受信時に手作業で解析する終わり。スペースを節約できるのは、これらの前提と追加のコーディング作業です。

サーバの応答のプロパティ名とフォーマットが既にコードに知られている場合は、あなただけの値を交互に配列としてデータを返すことができます:

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

か、その名前ドンを仮定しても安全だ場合

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

またはあなたはまだそれが有効なJSONになりたい場合は、あなたが置くことができます。「tはカンマが含まれ、あなたも、あなたがそれの部分に分割し、独自のデータ構造に固執することができ、カンマ区切りの文字列を返すことができますそのような配列の文字列はslighだけです

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

これらの仮定とコンパクトさは、独自のJavaScriptのデータを解析するための責任の多くを入れて、それがの自己記述自然の除去である:アイテム自体は、配列の要素であり、私の最初のバージョンよりもTLY良くあなたが始めた完全なJSONはよりコンパクトな性質につながります。

+1

最後の例は技術的にはJSONドキュメントではないことに注意してください.JSONドキュメントはルートオブジェクトとして配列またはマップを持たなければならないからです。 –

+0

@DietrichEpp - 良い点 - 文字列が配列にもラップされるオプションを追加しました。これらのオプションの中からの選択肢は、転送されたバイトを最適化するかどうかにかかわらず、OPが正当なJSONにどれくらい固執するかによって異なります。 – jfriend00

5

通常、ほとんどのWebサーバーの&クライアントに簡単に組み込まれているgzip圧縮を使用しますか?

それはまだ&は、各端でJSONをパース生成するいくつかの(余分な)時間&メモリがかかりますが、それは、ネットワークを介して送信するためにそのくらいの時間がかかることはありません、とあなたに代わって、最小限の実装作業がかかります。

何らかの形でソースデータをあらかじめ圧縮していても価値があります。

1

JSONでは、実際には大量の文字列や「プロパティ」の重複があります(XMLの場合もありません)。

これは、DEFLATEアルゴリズムのアドレス(GZipで使用される)の正確な内容です。

ほとんどのブラウザクライアントはGZip圧縮応答を受け入れることができますが、サーバへのトラフィックは返されません。

「JSON圧縮」(つまり、hpackなど)を使用することは保証されていますか?

  1. これはJavaScriptでgzipで圧縮実装するよりもはるかに高速である可能性が低いです(不可能ではありません。あなたが250ミリ秒で100キロバイトを圧縮することができ、合理的に速いマシン上)。

  2. 信頼できないJSON入力を安全に処理することはかなり困難です。ストリームベースの解析を使用し、最大の複雑さのしきい値を決定する必要があります。そうしないと、サーバーが驚くかもしれません。インスタンスアーミンRonacherのStart Writing More Classesを参照してください:

    あなたの小ぎれいなWebサーバがgevent経由10000個の要求秒を取得しているが、json.loadsを使用している場合、私はおそらくそれはそれをうまく細工された16MBのを送信することにより、停止にクロールすることができますすべてのCPUを浪費するネストされたJSONがあります。