GWT JSONObject覆盖类型(或在共享中使用JSONObject)

时间:2013-01-08 16:04:06

标签: java json gwt gxt jsni

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

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

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

UserOverlay user = getUser(jsonobj);

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

结论

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

2 个答案:

答案 0 :(得分:2)

如果您指的是Crockford's JSON implementation for Java,则无法在客户端代码上使用它的原因是首先需要emulated。为了您的目的,您希望使用不同的方法;

让服务器返回JSON文本响应(当然是通过HTTP),通过客户端上的XHR请求它,而不是以原始形式使用响应 - JSON is a subset of JavaScript's literal object notation,它可以在JavaScript中透明地使用代码。

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

Google Developer文档提供了Retrieving 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

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

    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. 调用servlet

    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();
    
  5. Google Web Toolkit文档中的参考资料

答案 1 :(得分:0)

我现在将JSON保存为共享包中的String。

我使用org.JSON来完成我在服务器上获取的内容以及客户端中的覆盖类型。

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