Свойства AutoBean, Arrays/Lists и JSNI
Я как-то борюсь с Массивами и JSNI в контексте Autobeans.
В одном из моих проектов GWT я получаю данные из бэкэнда, используя JSON.
После того, как данные получены на клиенте, я хочу визуализировать их с помощью пользовательских виджетов визуализации (разработанных в javascript).
Вот компоненты:
Структура JSON:
{'ids':[1,2,3,4],'data':[[1.0],[1.0,2.0],[1.0,2.0,3.0] ... ]}
В основном у меня есть два набора данных в моей полезной нагрузке JSON. id - это массив целых (int[]
) а data - это массив массивов с плавающей точкой (float[][]
)
Конечно, существуют разные способы анализа данных на клиенте. Я решил использовать AutoBeans. Итак, я определил интерфейс для моей структуры JSON.
AutoBean:
interface MyData {
List<Integer> ids;
List<List<Float>> data;
}
Разбор данных работает нормально.
Мои пользовательские виджеты визуализации имеют функцию API для установки данных, которые выглядят следующим образом:
function api_setData(ids,data) {
//ids should be an Array of Ints
//data should be an array of array of Floats.
}
Проблема в том, что с JSNI я не могу использовать обычные массивы Java. Я должен использовать JsArray
,
public final native void setData(JsArrayInteger ids,JsArray<JsArrayInteger> data /*-{
this.api_setData(ids,data);
}-*/;
Поэтому я должен преобразовать свои свойства AutoBean (данные и идентификаторы) в экземпляры JsArray. Есть ли лучший / лучший способ сделать это?
Или, может быть, я должен использовать JSONParser
вместо AutoBeans
Это более эффективно?
1 ответ
Если вам приходится иметь дело с JSNI, более того, если вы используете MyData
интерфейс только на стороне клиента, то не используйте AutoBeans. Вместо этого используйте наложения JSON:
public class MyData extends JavaScriptObject {
protected MyData() { /* required for JSOs */ }
public final native JsArrayInteger getIds() /*-{ return this.ids; }-*/;
public final native JsArray<JsArrayNumber> getData() /*-{ return this.data; }-*/;
}
А затем проанализировать ваш JSON:
MyData data = JsonUtils.safeEval(jsonStr);
customVisualizationWidget.setData(data.getIds(), data.getData());
С другой стороны, предполагая, что вам нужны только проанализированные данные для setData, просто используйте JavaScriptObject
,
В вашем виджете:
public final native void setData(JavaScriptObject obj) /*-{
this.api_setData(obj.ids, obj.data);
}-*/;
Когда вам нужно проанализировать JSON и передать его виджету:
customVisualizationWidget.setData(JsonUtils.safeParse(jsonStr));