Свойства 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));
Другие вопросы по тегам