在Autobeans的背景下,我在某种程度上与Arrays和JSNI挣扎 在我的一个GWT项目中,我使用JSON从后端检索数据 一旦在客户端上检索数据,我想使用自定义可视化小部件(在javascript中开发)来可视化它。
以下是组件:
JSON结构:
{'ids':[1,2,3,4],'data':[[1.0],[1.0,2.0],[1.0,2.0,3.0] ... ]}
基本上我的json有效负载中有两个数据集。 ids 是一组int(int[]
)和数据是一系列浮点数组(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属性(数据和 ids )转换为JsArray实例。 是否有更好/更好的方法来做到这一点?
或者我应该使用JSONParser
代替AutoBeans
这样效率更高吗?
答案 0 :(得分:3)
如果您必须处理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));