В настоящее время пытаюсь структурировать объект Java ArrayList в GWT, используя метод взаимодействия для вызова собственного JSON.stringify (ArrayListobj).Это приводит к прекрасному представлению JSON базового содержимого списка массивов в форме массива.Это даже работает для, казалось бы, более сложных объектов класса Java, но в этом случае я собираюсь использовать Strings для демонстрации.Сначала на моей стороне создания:
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);
}
Пока все хорошо, все это работает отлично, и результаты, которые я получаю, представляют собой строковое представление JSON содержимого ArrayList
"{" array_0 ": [" first ","second "]}"
Затем пропустите этот бит через синтаксический анализатор:
ArrayList<String> returned = new ArrayList<>();
Object[] var = JSON.parse(jsonstr);
И var - это правильное представление (при просмотре выполнения веб-браузеров приостановлено) нижележащегоданные из первого ArrayList.Проблема в том, что Object [] массива JSON преобразован обратно в объект Java ArrayList.
Я пытался использовать код JSNI для извлечения элементов массива, который на самом деле в консольном трее в веб-браузере работает отлично, но компилятор пытается перехитрить меня и переименовывает элемент array такмой код 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.Массив больше не связан с данными, к которым я пытаюсь получить доступ.
Из всех проведенных мною испытаний это самый быстрый способ получения одного и того же объекта ArrayList (его гарантированно определено одинаково в обоих местах) из одного места в клиентском программном обеспечении в другое место.в клиентском программном обеспечении (здесь сервер не задействован) путем строкового преобразования.
Но информации о том, как манипулировать JavaScript на низком уровне в GWT, в лучшем случае не хватает.
И я попробовал все варианты механизмов GWT-RPC, GWT-Jackson,AutoBeans (если только они поддерживают объекты с несколькими примитивными типами!) Requestbuilder, назовите его.
И НЕТ, прежде чем вы это предложите, я не заинтересован в том, чтобы снова выполнить полный анализ строки GWT-JSON, я уже сделал это, когда первоначально извлекал тысячи записей с сервера и помещал их вJava ArrayList.Для анализа JSON в GWT требуется более 200 мс, а функция анализа JSON в браузерах обрабатывает эту строку примерно за 3 мс.