GWT — типы оверлеев JavaScript и JSON

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

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

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

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

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

к которому я перехожу

{"FirstName": "Jimmy"}

как String, и он возвращает мне объект Java следующим образом:

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

Это возможно?

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


person Stefan    schedule 20.06.2011    source источник


Ответы (2)


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

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

Customer customer = JsonUtils.safeEval(jsonString);
person Thomas Broyer    schedule 20.06.2011
comment
Я добавлю JsonUtils в свой пост :) (я не включил в него никаких предупреждений о безопасности... Я предположил, что строка json контролировалась заранее) - person helios; 20.06.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);
}-*/;
person helios    schedule 20.06.2011
comment
спасибо, в таком случае это должно пойти к Томасу.... Я тоже думал об этом ночью...... - person Stefan; 21.06.2011