我需要处理从服务返回的数据,该服务具有比 GXT 文档中提供的示例更复杂的 JSON 结构,到目前为止,我找不到任何说明或示例来说明如何实现这一点。
JSON 包含多个键/值对,但其中一些键/值对是集合。我可以在一次调用中以适当的结构从服务返回给我的所有数据,但似乎没有一种方法可以将数据解析为单独的实体。在我的特殊情况下,我正在尝试配置一个加载器,它将处理其中一个集合,但我还需要来自同一消息的其他键/值对(让加载器进行一次调用然后再调用一次是不行的相同的数据并检索其他键/值对)。有没有办法使用 GXT3 来完成这个?
示例:假设我可以从服务器发出请求,该服务器返回 JSON,其中包含作者姓名以及作者所写书籍的集合。我想在列出书籍的网格上方显示作者的姓名。我只想向服务器发出一个请求,然后让我的视图在一个组件中显示作者,并在网格中显示书籍列表。假设我需要一个加载器而不仅仅是一个商店,因为网格可能需要进行额外的调用(例如,如果它是一个分页网格、livegrid 等)。
示例 JSON:(返回的一条 JSON 消息与作者元素以及书籍元素的集合一起返回 - 我已缩进 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());
}
}