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

标签 java json gwt gxt jsni

我在 GWT 服务器端填充 JSONArray (org.JSON),然后想要在客户端使用该对象。当我在共享包中使用 JSONObject(或数组)时,出现异常:找不到源(虽然它在服务器上运行)。因此,我认为它不能在客户端使用或共享(尽管谷歌搜索仍无法确认)。

由于共享不会使用 JSONObject,因此我认为 JSNI 可以在共享中工作。我已经在 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 的转换的线程,但不是相反。

最佳答案

如果您指的是Crockford's JSON implementation for Java ,它不能在客户端代码上使用的原因是它需要是 emulated第一的。出于您的目的,您需要使用不同的方法;

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

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

Google 开发者文档提供了有关 Retrieving JSON 的教程,仅讨论这一点。为了完整起见,我将包含重点内容和一些片段:

  1. 创建一个服务 JSON 的 servlet

    不要忘记相应地配置 Web 应用的部署描述符 (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. 根据响应的接口(interface)构造覆盖类型

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

    本教程建议在 JSNI 方法中使用 eval(),但我更喜欢使用 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. 调用 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();
    

Google Web Toolkit 文档引用

关于java - GWT JSONObject 覆盖类型(或在共享中使用 JSONObject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14219101/

相关文章:

java - 如果同时有很多请求,多线程是否会提高性能?

java - 使用 Jackson 序列化/反序列化携带额外信息的不可变对象(immutable对象)

java - GWT 和动态选项卡

javascript - 将动态键、值对添加到 JavaScript 数组或哈希表

javascript - 使用 jQuery 将表单数据转换为 JS 对象,包括分组值

gwt - 如何使用 GWT Designer 配置 Ext GWT?

GWT JSNI 中的 Javascript 条件编译

java - 如何在 liferay 的速度模板中创建 sortedmap 或 treemap

Java String.valueOf(null) 抛出 NPE,但 Object a = null; String.valueOf(a) 返回 'null'

java - 使用python与java程序交互