私はGXTから始めており、JsonReaderを使用して複数のルートオブジェクトを持つ有効なjson文字列を解析する方法について少し混乱しています。グリッドにレコードを表示するSQLステートメントを作成するための一連の選択ボックスがあります。データベースからも選択範囲の値を取得しています。私がやろうとしているのは、1つの文字列内の選択ボックスのすべての値を使用してjsonを構築するためのphpデータベース関数への単一のリクエストです。私の最初の考えはJsonReaderでした。
これが私が使っているjsonの例です:
"categories":[{"id":"1","value":"categoryValue1"},{"id":"2","value":"categoryValue2"}], "frequencies":[{"id":"1","value":"frequencyValue1"},{"id":"2","value":"frequencyValue2"}]
APIのcityListの例から構築して、これは私がこれまでに得たものです。
JsonRootObjectインターフェイス:
public interface JsonRootObject {
List<SelectionProperties> getCategories();
List<SelectionProperties> getFrequencies();
}
JsonRootObjectAutoBeanFactory:
public interface JsonRootObjectAutoBeanFactory extends AutoBeanFactory {
AutoBean<JsonRootObject> jsonRootObject();
}
すべてが単一のint/文字列値のペアであるため、SelectionPropertiesインターフェイスを作成しました。
public interface SelectionProperties {
String getId();
String getValue();
}
さて、APIによると:
// To convert from JSON data, extend a JsonReader and override
// createReturnData to return the desired type.
そこで、カテゴリと頻度の両方のリーダーを作成しました。CategoryReader:
public class CategoryReader
extends
JsonReader<ListLoadResult<SelectionProperties>, JsonRootObject> {
public CategoriesReader(AutoBeanFactory factory, Class<JsonRootObject> rootBeanType) {
super(factory, rootBeanType);
}
protected ListLoadResult<SelectionProperties> createReturnData(Object loadConfig, JsonRootObject incomingData) {
return new ListLoadResultBean<SelectionProperties>(incomingData.getCategories());
}
}
FrequencyReader:
public class FrequencyReader extends
JsonReader<ListLoadResult<SelectionProperties>, net.apoplectic.testapps.client.JsonRootObject> {
public FrequencyReader(AutoBeanFactory factory, Class<JsonRootObject> rootBeanType) {
super(factory, rootBeanType);
}
protected ListLoadResult<SelectionProperties> createReturnData(Object loadConfig, JsonRootObject incomingData) {
return new ListLoadResultBean<SelectionProperties>(incomingData.getFrequencies());
}
}
これは完全に正しく感じられません。基本的に同じコードの複数のインスタンスを作成し、実際のjson文字列を2回解析しています(この時点で、掘り下げるとグリッドのオプションが増える可能性があります)。私の質問は、何かが足りないのか、それとも応答文字列を解析するためのより効率的な方法があるのかということです。私のonSuccessfulResponseから:
JsonRootObjectAutoBeanFactory factory = GWT.create(JsonRootObjectAutoBeanFactory.class);
CategoryReader catReader = new CategoriesReader(factory, JsonRootObject.class);
FrequencyReader freqReader = new FrequenciesReader(factory, JsonRootObject.class);
categories = catReader.read(null, response);
frequencies = freqReader.read(null, response);
List<SelectionProperties> categoriesList = categories.getData();
List<SelectionProperties> frequenciesList = frequencies.getData();
ListBox cateBox = new ListBox(false);
ListBox freqBox = new ListBox(false);
for (SelectionProperties category : categoriesList )
{
cateBox.addItem(category.getValue(), category.getId());
}
for (SelectionProperties frequency : frequenciesList)
{
freqBox.addItem(frequency.getValue(), frequency.getId());
}
上記は機能しますが、両方のリストボックスが正しく入力されています。これが正しいアプローチかどうか疑問に思います。前もって感謝します!