GWT - Типы наложения JavaScript и JSON - PullRequest
1 голос
/ 20 июня 2011

Я работал в Google Codeing Basics (http://code.google.com/intl/de-DE/webtoolkit/doc/latest/DevGuideCodingBasicsOverlay.html#example-collections) и подумал: эй, это может быть намного быстрее и проще в использовании, чем разбор моего JSON-объекта вручную.

Поэтому я поиграл с примером и заметил, что онработал нормально, когда JsArray был определен в файле HTML, но я не смог найти решение для передачи String или Url в функцию, и он возвращает мне тип наложения.

Итак, я хочу сделать следующее:

У меня есть эта функция

    private native Customer getFirstCustomer(/*TYPE (preferd String)*/ name) /*-{
    return (CASTVALUE TO ???) name; 
}-*/;

К которой я передаю

{"FirstName": "Jimmy"}

как строку, и она возвращает мне Java-объект, подобный этому:

    import com.google.gwt.core.client.JavaScriptObject;
    class Customer extends JavaScriptObject {
      protected Customer() { }
      public final native String getFirstName() /*-{ return this.FirstName; }-*/;
    }

Возможно ли это?

С уважением, Стефан

Ответы [ 2 ]

6 голосов
/ 20 июня 2011

Пожалуйста, ни в коем случае не eval() вещи вслепую! (безопасность 101)

Вместо этого используйте GWT JsonUtils : он будет использовать встроенную поддержку JSON в браузерах, которые его поддерживают (быстрее и безопаснее, чем eval()), и будет проверять JSON перед eval() его использованием в других (что IE6, IE7 и старый Safaris - pre 4.0.3–, все остальные версии браузера без собственного JSON к настоящему моменту не работают):

Customer customer = JsonUtils.safeEval(jsonString);
1 голос
/ 20 июня 2011

Если у вас есть строка JSON, для создания объекта javscript, вы должны проверить его :

private native Customer getFirstCustomer(String jsonString) /*-{
    return eval(jsonString);
}-*/;

Если ваш нативный метод возвращает ваш класс Customer (он должен расширять JavaScriptObject), он будет приведен автоматически (компилятор Java примет его, в JS он не нуждается в приведении).

См. этот справочник тоже.

Важное обновление безопасности:

Спасибо Томасу Бройеру

Не используйте eval напрямую. Используйте JsonUtils.safeEval(String) ( API ). Это позволит избежать выполнения небезопасного кода JavaScript, который может появиться в строке.

private native Customer getFirstCustomer(String jsonString) /*-{
    return JsonUtils.safeEval(jsonString);
}-*/;
...