当前尝试使用互操作方法在 GWT 中对 Java ArrayList 对象进行字符串化,以调用本机 JSON.stringify(ArrayListobj)。这会以数组的形式生成底层数组列表内容的完美 JSON 表示。这甚至适用于看似更复杂的 Java 类对象,但在本例中,我将使用字符串来演示。首先在我的创作方面:
test = new ArrayList<>();
test.add("first");
test.add("second");
String jsonstr = JSON.stringify(test);
现在基于我的 JsInterop 代码,我返回一个对象(或对象数组,如下面的代码所示):
@JsType(isNative=true, namespace=GLOBAL)
public class JSON {
public native static String stringify(Object obj);
public native static Object[] parse(String obj);
}
到目前为止一切顺利,所有这些都完美运行,我得到的结果是 ArrayList 内容的字符串化 JSON 表示
"{"array_0":["first","second"]}"
然后通过解析器运行这个位:
ArrayList<String> returned = new ArrayList<>();
Object[] var = JSON.parse(jsonstr);
并且 var 是来自第一个 ArrayList 的基础数据的正确表示(当查看 web 浏览器执行暂停时)。问题是将 JSON 数组的 Object[] 转换回 Java ArrayList 对象。
我尝试使用 JSNI 代码来提取数组元素,实际上它在 Web 浏览器的控制台托盘中运行良好,但编译器试图智取我并重命名数组元素,因此我的 JSNI 代码无法触及它。
如果我的代码如上,并且我编写 JSNI 类似:
public static native ArrayList objToList(ArrayList add,Object inVal) /*-{
var length = inVal.array.length;
for(var i = 0;i < length; i++){
add.array[i] = inVal.array[i];
}
return add;
}-*/;
然后编译器将重命名数组array_0,这样我的代码 inVal.array 就不再与我试图访问的数据相关联。
从我所做的所有测试来看,这是迄今为止从客户端软件中的一个位置到客户端软件中的另一个位置(没有服务器)获取相同 ArrayList 对象(保证在两个地方以相同方式定义)的最快方法这里涉及)通过字符串化。
但是关于如何在 GWT 中低级别操作 JavaScript 的信息充其量是缺乏的。
而且我已经尝试了 GWT-RPC 机制、GWT-Jackson、AutoBeans 的所有变体(如果它们支持具有多种原始类型的对象!)requestbuilder,你可以命名它。
不,在您提出建议之前,我对再次对字符串进行完整的 GWT-JSON 解析不感兴趣,当最初将数千条记录从服务器中拉出并将它们推送到 Java ArrayList 时,我已经这样做了。在 GWT 中解析 JSON 需要 200+mS,而浏览器 JSON 解析函数处理这个字符串大约需要 3mS。