Не удается заставить сериализацию gwt json работать с оверлейной системой - массив всегда пуст - PullRequest
0 голосов
/ 28 января 2012

Я впервые пытаюсь разобрать json в gwt, и он не работает.Поскольку я новичок, это может быть очевидной глупой ошибкой.Массив не получен правильно.

Это фрагмент кода, который я отлаживаю:

String json = "{\"lokacije\":[{\"sifraLokacije\":1,\"nazivLokacije\":\"Policijska stanica\",\"brojDokumenata\":70}],\"status\":1}";
LocationsResponse locationsResponse = createLocationsResponse("("+json+")");
// this is ok, status is 1
int status = locationsResponse.getStatus();
// length of this array is 0 and you can see from json that it has one element (the same if it has more)
int brojLokacija = locationsResponse.getLokacije().length();

...

private final native LocationsResponse createLocationsResponse(String json) /*-{
    return eval(json);
}-*/;

Класс LocationsResponse:

public class LocationsResponse extends JavaScriptObject {

    protected LocationsResponse() {}

    public final native int getStatus() /*-{ return this.status; }-*/;

    public final native JsArray<JSOLokacija> getLokacije() /*-{ this.lokacije; }-*/;

}

Класс JSOLokacija:

public class JSOLokacija extends JavaScriptObject {

    protected JSOLokacija() {} ;

    public final native int getSifraLokacije() /*-{ this.sifraLokacije; }-*/;

    public final native String getNazivLokacije() /*-{ this.nazivLokacije; }-*/;

    public final native int getBrojDokumenata() /*-{ this.brojDokumenata; }-*/;

}

1 Ответ

1 голос
/ 28 января 2012

Второе редактирование: Вау, я просто бесполезен сегодня. Мой первый ответ вернул JSONValue, что довольно раздражает, если вы хотите работать с JSO.

Редактировать: Aaand только что заметил ваш комментарий, что вы исправили это ... Тем не менее, использование предоставленных инструментов, как правило, поможет вам не попасть в неприятные ситуации, подобные этой.

Вот еще один инструмент, который вы должны знать, особенно если вы используете JSON, а не только объекты из JS: AutoBeans (http://code.google.com/p/google-web-toolkit/wiki/AutoBean) - с ними вам не нужно выписывать код JSNI, просто определите свойства, которые вы ожидаете получить, и он обработает весь код оболочки.


Первый, в основном бесполезный ответ:

eval не работает так - он предназначен для запуска JS, а не для превращения JSON в данные, а выражение json (также выражение js) не является допустимым утверждением в Javascript. Добавление «(» и «)» к контенту - вот почему оно вообще работает, но это несколько рискованно - обычно лучше, если это возможно, доверять браузеру, чтобы сделать это правильно:

Используйте JSONParser.parseStrict (или parseLenient, если вы ожидаете ошибки синтаксического анализа, но абсолютно уверены, что оттуда не может произойти никаких возможных атак - это в конечном итоге вызовет для вас eval, но таким образом вам не нужно поддерживать его ) вместо этого, чтобы убедиться в безопасности содержимого и правильно проанализировать его для js. Чтобы затем превратить это в JSO, вы вызываете .isObject().getJavaScriptObject() для результата метода синтаксического анализа, который затем должен быть .cast () с правильным значением.

...