2011-10-25 2 views
10

Gzipped JSONがすでにこれをカバーしているかどうかは疑問です。JSONレスポンスをもっと小さくする...ちょうどいいアイデア

しかし、あなたが応じてゲームオブジェクトのリストを持っていると言う:

game = { 
    name: 'Randomer Quest!', 
    description: 'Randomer's Quest is a brilliant game!', 
    activated: true, 
    points: 10, 
    thumb: 'randomer-quest.jpg' 
}; 

これをjson_encodeすると、それは151 bytes次のようになります。[OK]を

{"games": [{"name":"Randomer Quest!","description":"Randomer's Quest is a brilliant game!","activated":true,"points":10,"thumb":"randomer-quest.jpg"}]} 

...しかし、どのような場合は、あなたが持っています約100試合のリスト?それは約13,913 bytesです...しかし、私たちは本当にそれらのプロパティを宣言し続ける必要がありますか? 私はそれをデコードしてループさせることができることは知っていますが(マジック)、ちょっと知的で、別のオブジェクトにプロパティを宣言してから、データの配列を持っていればどうなりますか?私たちは通常そこにはないプロパティを事前に設定する必要がありますが、私はまだその価値があると思います。

このような何か:

{ 
"games": { 
    p: ["name", "description", "activated", "points", "thumb"], 
    d: [ 
     ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"], 
     ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"] 
    ] 
} 

}

Pプロパティであり、Dは、アレイ内のデータです。その後、私たちは持っています:9,377 bytesサイズの67%!

私はあなたが何も言わないだろうと知っていると知っていますが、あなたはもっと40-100kbのような要求を見ます。それはかなり大きな違いだと私は思う。誰かがすでにこのような何かを採用していますか?すでにこれを自動的に行うツールがあるのでしょうか?

32bitkidは、これを行うつもりなら、CSV形式に切り捨てることもできます。これは意味があります... 9,253 bytes 66.5%になります。

"name", "description", "activated", "points", "thumb" 
"Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg" 
"Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg" 

は、私が(負け33.5キロバイト)

あなたはどう思いますか66.5キロバイトに変わるだろう100キロバイト程度のJSON要求を、見てきましたか?

ドム

+1

[JSONH](https://github.com/WebReflection/JSONH)は同様です。 – hyperslug

+0

"TSON"、テーブル形式のJSON(私は名前を提案しなければならなかった) – SparK

+0

私は本当にこのアイデアが好きです!今すぐこの問題が発生しました。プロパティ名が大量に繰り返されるため、JSON応答が大きすぎます。 – HorseloverFat

答えて

11

私はこれがはるかにコンパクトであることに同意します。

{ 
    "games": { 
     p: ["name", "description", "activated", "points", "thumb"], 
     d: [ 
      ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"], 
      ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"] 
     ] 
    } 
} 

しかし、あなたは本当に "ゲーム"オブジェクトが必要ですか?これはさらに小さい!

{ 
    p: ["name", "description", "activated", "points", "thumb"], 
    d: [ 
     ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"], 
     ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"] 
    ] 
} 

そして本当に、いただきました!「P」と「D」と格納するオブジェクトのポイントは、私は、プロパティ名が最初にあることを行っている、と私のデータを第2になるだろうことを知っていますか?

[ 
    ["name", "description", "activated", "points", "thumb"], 
    ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"], 
    ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"] 
] 

これらの配列とオブジェクトのマーカーはちょうど途中にあります。数バイトを節約してください。

"name", "description", "activated", "points", "thumb" 
"Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg" 
"Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg" 

待機中...この形式は既に存在します。 CSVです。そして1960年代半ば以来その周辺にありました。 XMLとJSONが最初に発明された理由の一部です。 JSONとXMLは、格納されているオブジェクトに柔軟性を与え、密接にパックされたバイナリオブジェクトよりも読みやすくします。あなたは実際にパイプを通過するデータのサイズについて心配していますか?もしあなたが(実際にはボトルネックであれば)その問題に対処するためのさまざまな方法があります。

しかし、個人的には、自分が作った技術とツールを使うべきだと思っています。

ハンマーを使ってネジでネジ止めしようとしています...あなたは壁に取り付けられますが、いずれかのパーティーにはかわいくて楽しいものではありません。

あなたの問題を解決するパターンを見つけ、それ以外の方法ではありません。

+0

良い点:Dこれで言及しました。おそらくもっとCSVを使い始めることをお勧めします。私はJSONが好きですが、読みやすさのためにプロパティを渡すのに浪費されていると思っています(raw JSONを読む必要はあまりありません)。 CSVをもっと使い始めるだろうと思います。とにかくJSONレスポンスを解析する必要があるので、同じ結果を得るためにパーサーを使ってCSVを実行してください。私の質問はCSVのサイズで更新されます:P –

+0

@Dominic:ここでカットしたものは、毎日(または3ヶ月後)に対処したいですか?どのフィールドが対象か、まったく表示されていないフィールド(最後のフィールド)が記述されていますか?あなたがCSVファイルのどのフィールドを使うかを覚えていなければならないという事実は、数バイトの価値がありません。しかし、注意* emptor *。 CSVを使用して数ヶ月後、あなたは私が何を意味するか見るでしょう。また、JSONを使用すると、他のものの内部にオブジェクトを入れ子にすることができます。 –

+0

他のオブジェクトの中にオブジェクトをネストする必要がある場合は、他の方法は見えませんが、アイテムの横にラベルが付いていないという問題はまだ表示されません。生のJSONは読んではいけません。ここでは同じことが読めるようにするツールがあるからです。 –

0

これは非常に興味深いです、あなたが転送するデータの多くを持っている場合BSONをチェックすることもできます。

2

サーバー側の言語には、serializeJson()というColdFusionが使用されています。これによりJSONパケットが作成され、クエリからのものであれば、提案するものとほぼ同じように見えます。

​​

あまりにもうまく機能します。

5

経験から、テキストベースの形式を使用する主な理由は、人間が(使い慣れたツールを使用して)読み込みとデバッグが容易であることです。 [例えば、私はXMLを大部分のタスクでは大したものではないと考えています]

私たちがテキスト形式を使用する理由についてのかなり古いリファレンスですが、深刻な価値がまだありますが、this chapter of The Art of Unix Programmingです。

したがって、サイズではなく明瞭さを目指す必要があります。サイズを目指すことは時期尚早の最適化の場合です。

帯域幅やストレージが不安な場合は、データを圧縮することを検討してください。テキスト形式は、技術的には、バイナリ形式に劣らず、高速かつ強力な圧縮に適しています。また、1 /データの表現を簡便に2 /データを効率的に転送するという懸念を分離します。

私はこのドメインに精通していませんが、データをプロトコルレベルで圧縮するための圧縮2 /体系的な方法のための1/Javascriptライブラリがあると確信しています。

最後に、パフォーマンスが心配な人は、テキストベースのフォーマットが提供する快適性をあきらめるための説得力のある理由(およびプロファイルデータ)があります。

+0

Ahhはい、しかし未処理のJSON出力は読み込めませんChromeのJSONフォーマッタに似ています。https://chrome.google.com/webstore/detail/chklaanhfefbnpoihckbnefhakgolnmc –

+0

@Dominic Watson:これは、可読性と可用性を犠牲にしないことです。 JSONは多くの環境で容易に利用でき、肉眼ではXMLよりも読みにくいです。また、XMLを操作するためのツールは、JSONのツールよりもはるかに重視される傾向があります(そして、私はまだ軽い代替の上に* XMLが必要なユースケースを見ていません)。 –

0

MessagePackはどうですか?

http://msgpack.org/

MessagePackは、効率的なバイナリシリアル化形式です。 はJSONのような複数の言語間でデータを交換できます。しかし、それは速く、 小さいです。小さな整数は1バイトにエンコードされ、一般的な 短い文字列は、文字列 自身に加えて1つの余分なバイトだけを必要とします。

関連する問題