2011-12-25 6 views
0

jsonは安らかなURLを作成するのに便利なmediatypeですが、最近問題が発生しているので、エンティティモデルクラスをjson文字列に直接変換して応答します。 .but多くのエンティティモデルのような...他のモデルと1つのリレーションに多くの多くのものを、持っている:私は、JSON文字列にモデルインスタンスを変換REST:jsonをより簡潔にする方法

class Model{ 
.... 
List<model2> model2s; 
} 
class Model2{ 
... 
List<Model3> model3s; 
} 
... 

...このJSON文字列の長さは恐ろしいする必要があります...これを避ける方法...ありがとう

+0

多すぎるリソースが混在している可能性があります。 RESTサービスでは単一のリソースしか提供できませんか?あなたのアプリケーションはモデルを取得し、他のモデルへの参照を持っていなければなりません。もう1つのリソース、つまり 'GET/model/1'から' GET/model2/1'などのような単一リソースとしてRESTを取得する必要があります。 – Dan

+0

@Danそれはかわいいです'GET/model'にすべてのリソースエンティティまたはリソースエンティティのサブセットを返すように共通です。 – abraham

+0

@abraham:それは彼が避けたがっている大量のデータにつながります。私はちょうどそれを分割することは、おそらく冗長な検索を避けるために、より小さな部分に分解するオプションかもしれないと言っています。 – Dan

答えて

0

あなたは何らかのロジックに基づいてデータを選択的に返すことを決めない限り、あなたは傾けません。これをxmlとして返すと想像してください。さらに恐ろしいでしょうか?それとも、私はあなたの質問を完全に逃したのですか?

なぜ、結果として生じるJSONの複雑さを心配しますか?これは、自動的に解析されます(JavaScriptまたはWebサービスのクライアントによって)。

データサイズが問題になる場合は、レスポンスを圧縮することができます。

0

JSONのサイズは、JSONが遅い(er)javascriptエンジン(古いIEなど)を搭載したブラウザで実行されているjavascriptによって解析/消費されている場合には、特に問題になります。データがワイヤを介して圧縮されても、配信にのみ影響します。完全なメッセージは引き続きブラウザで解析する必要があります。

いくつかのルール/提案:

まず、データの量を減らすには、 - 受信アプリケーションのニーズにのみデータを送信します。具体的には、消費アプリケーションに表示される必要がないmodel2smodel3sのインスタンスをすべて除外します。

インスタンスを除外できない場合は、各インスタンスのデータ量を減らしてください。すべてのフィールドをJSONにエンコードしないでください。例えば、model2s場合は四つのフィールドがあります。namedatesummaryauthorを、そしてクライアントアプリケーションはのみのみnamedateを送り、namedate必要があります。

最後に、データから冗長性を削除します。データが正規化されておらず、Model2に、Model(たとえば)に正しく属するデータのコピーがある場合は、Modelという表現でそのデータのみを送信します。同様に、Model2Model3の関係が多対多である場合は、model3データの1つのインスタンスのみを送信し、そのコピーの参照スキーム(たとえばYAMLなど)を実装します。

関連する問題