1

我在我的 GWT 服务器端填充了一个 JSONArray (org.JSON),然后想在客户端使用该对象。当我在我的共享包中使用 JSONObject(或数组)时,我得到了没有找到源的异常(虽然它在服务器上工作)。因此,我认为它不能在客户端使用或共享(尽管谷歌搜索无法确认)。

由于 shared 不会使用 JSONObject,我假设 JSNI 可以在 shared 中工作。我已经阅读了 google developer 和 stackoverflow 上的 GWT 覆盖类型,并在我的共享包中做了一个。但是,由于是 JSNI,所以不能在服务器上使用。因此,我尝试将 JSONObject.toString() 传递给我的共享类,然后将其用作调用以下 JSNI 方法的参数:

public native UserOverlay getUser(String jsonObj) /*-{
    return jsonObj;
}-*/;

电话:

UserOverlay user = getUser(jsonobj);

但是,这会在调用位置产生 UnsatisfiedLinkError,据我所知,这意味着找不到 JSNI 方法,这意味着共享包不适用于 JSNI。

结论

我需要一种方法来在客户端、共享和服务器上使用我的 JSON 数据。如果该方法不同,那么我需要一种将一种方法转换为另一种方法的方法。我见过处理从覆盖类型转换为 JSONObject 的线程,但不是相反。

4

2 回答 2

2

如果您指的是Crockford 的 Java 的 JSON 实现,它不能用于客户端代码的原因是它需要首先被模拟。出于您的目的,您想使用不同的方法;

让服务器返回一个 JSON 文本响应(自然是通过 HTTP),通过客户端上的 XHR 请求它,然后以原始形式使用响应——因为JSON 是 JavaScript 文字对象表示法的子集,它可以在内部透明地使用JavaScript 代码。

要在 GWT 中实现此方法,请创建一个将 JSON 作为文本返回的 servlet(将其输出到响应的编写器)。然后可以使用(包装 XHR)从客户端调用此 servlet RequestBuilder,并且可以使用覆盖类型将每个 JSON 响应根据其合同转换为 Java 托管对象。

谷歌开发者文档提供了一个关于检索 JSON的教程,讨论了这个问题。为了完整起见,我将包含重点和一些片段:

  1. 创建一个服务 JSON 的 servlet

    不要忘记相应地配置 webapp 的部署描述符 ( web.xml)。

    public class JsonDataServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
    
            PrintWriter out = resp.getWriter();
            out.println('{');
            // fill with JSON construct
            out.println('}');
            out.flush();
        }
    
    }
    
  2. 根据响应的接口构造覆盖类型

  3. 创建客户端实用程序以将 JSON 响应转换为具体的JavaScriptObject

    本教程建议在eval()JSNI 方法中使用,但我更喜欢使用它,因为它会首先尝试在支持JSONParser.parseStrict()的浏览器上调用 JavaScript 。JSON.parse()

    public static UserOverlay asUserOverlay(String json) {
        JSONValue jsonVal = JSONParser.parseStrict(json);
        JSONObject jsonObj = jsonVal.isObject();
        UserOverlay userOverlay = (UserOverlay) jsonObj.getJavaScriptObject();
    }
    

    注意:如果您仍然要使用该eval()实现,则json参数需要用括号括起来,即eval('(' + json + ')').

  4. 调用小服务程序

    RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, GWT.getModuleBaseURL() + "path/to/servlet");
    rb.setCallback(new RequestCallback() {
    
        public void onError(Request request, Throwable exception) {
            // do something
        }
    
        public void onResponseReceived(Request request, Response response) {
            if (200 == response.getStatusCode()) {
                UserOverlay userOverlay = asUserOverlay(response.getText());
                // continue handling
            }
        }
    });
    rb.send();
    

Google Web Toolkit 文档的参考资料

于 2013-01-11T16:46:10.043 回答
0

我现在将 JSON 作为字符串保存在共享包中。

我使用 org.JSON 来处理我在服务器上获取的内容并在客户端中覆盖类型。

aJsonArray.getJSONObject(i).toString();在将 JSON 字符串发送到客户端时使用它来获取它,并将其作为该字符串存储在我的可序列化中,然后在客户端上调用我的本机覆盖类型函数。像魅力一样工作,但我不确定这是否是最好的方法。它似乎是唯一的。

于 2013-01-09T14:01:28.310 回答