为什么使用JSNI和overlay类型来表示从GWT项目中的服务器返回的JSON对象?

时间:2014-10-20 22:22:27

标签: json gwt jsni

我正在阅读链接:http://www.gwtproject.org/doc/latest/tutorial/JSON.html并发现JSNI和overlay类型用于解码来自服务器端的JSON数据。

    // Send request to server and catch any errors.
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);

    try {
      Request request = builder.sendRequest(null, new RequestCallback() {
        public void onError(Request request, Throwable exception) {
          displayError("Couldn't retrieve JSON");
        }

        public void onResponseReceived(Request request, Response response) {
          if (200 == response.getStatusCode()) {
            updateTable(JsonUtils.<JsArray<StockData>>safeEval(response.getText()));
          } else {
            displayError("Couldn't retrieve JSON (" + response.getStatusText()
                + ")");
          }
        }
      });
    } catch (RequestException e) {
      displayError("Couldn't retrieve JSON");
    }

为什么它使用JsonUtils。&gt; safeEval(response.getText())来解码JSON数据?它必须这样做吗?这是使用GWT时接收JSON数据的唯一方法吗?

1 个答案:

答案 0 :(得分:1)

不,这不是唯一的方法。但是,JsonUtils.safeEval将使用浏览器的内置(即本机,因此被假定为最快的方式)JSON.parse()(有关详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) ,它会将JSON字符串转换为JavaScript对象。

反过来,覆盖类型允许您编写直接映射到JavaScript对象的Java代码,从而使您可以从普通的Java代码中轻松,轻松地讨论底层JS数据。

当然还有其他选项,在我的脑海中,你可以在JSONObject包中使用com.google.gwt.json.client类 - 这仍然可以进行JSON.parse()调用,但是通过类似于映射和列表的Java代码结构公开数据。此外,AutoBeans可以声明描述数据结构的接口,并从JSON字符串(或JavaScript对象)读取到这些接口中 - 它使您的代码更像Java,内置集合等等,一些表演来回转换的成本。