GXT のドキュメントで提供されている例よりも複雑な JSON 構造を持つサービスから返されたデータを処理する必要がありますが、これを実現する方法を示す指示や例は今のところ見つかりません。
JSON には複数のキーと値のペアが含まれていますが、キーと値のペアの一部はコレクションです。適切な構造のサービスから 1 回の呼び出しですべてのデータを返すことができますが、データを個別のエンティティに解析する方法はないようです。私の特定のケースでは、コレクションの 1 つを処理するローダーを構成しようとしていますが、同じメッセージから他のキーと値のペアも必要です (ローダーが 1 つの呼び出しを行ってから別の呼び出しを行うことは問題ありません)。同じデータを取得し、他のキーと値のペアを取得します)。GXT3 を使用してこれを達成する方法はありますか?
例: サーバーから、著者の名前とその著者が書いた本のコレクションを含む JSON を返すリクエストを作成できるとします。本をリストするグリッドの上に著者の名前を表示したいと思います。サーバーへのリクエストを 1 つだけ行い、作成者を 1 つのコンポーネントに表示し、本のリストをグリッドに表示するようにします。グリッドが追加の呼び出しを行う必要がある場合があるため (たとえば、ページング グリッド、ライブグリッドなどの場合)、単なるストアではなくローダーが必要であるとします。
JSON の例: (1 つの JSON メッセージが返され、author 要素と book 要素のコレクションが返されます - 構造を示すために JSON をインデントしています)
{ "returnData" :
{"author" : "AuthorName"},
{"books" :
{"id" : "1", "name" : "Book1"},{"id" : "2", "name" : "Book2"}
}
}
JsonReader の例 (例については javadoc を参照) を使用すると、要求を受け取り、AutoBeans を使用してリンクをコレクションに解析できます。ローダーでそれらを取得して解析する必要がある場合、これはうまく機能します。ただし、それを行うと、他のプロパティは無視されます。現在、同じリクエスト内の他の値を解析する方法が見当たらないため、他の場所で使用できます。コレクション処理のサンプル コードは次のとおりです。
// this is the root JSON object, the AuthorRecord
public interface AuthorRecord {
@PropertyName(value="author")
String getAuthor();
@PropertyName(value="author")
void setAuthor(String author);
@PropertyName(value="books")
List<Book> getBooks();@
@PropertyName(value="books")
void setBooks (List<Book> books);
}
// models the book objects returned
public interface Book {
@PropertyName(value="id")
String getId();
@PropertyName(value="id")
void setId(String id);
@PropertyName(value="name")
String getName();
@PropertyName(value="name")
void setName(String name);
}
public interface ReturnData {
AuthorRootObject getAuthorRoot();
}
public interface LibraryAutoBeanFactory extends AutoBeanFactory {
AutoBean<ReturnData> authorRecord();
AutoBean<ListLoadConfig> loadConfig();
}
public class ReturnDataJsonReader extends JsonReader<ListLoadResult<Book>,
ReturnData> {
public ReturnDataJsonReader(AutoBeanFactory factory,
Class<ReturnData> rootBeanType) {
super(factory, rootBeanType);
}
@Override
protected ListLoadResultBean<Book> createReturnData(Object loadConfig,
ReturnData incomingData) {
return new ListLoadResultBean<Book>(incomingData.getBooks());
}
}