我在 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 的教程,仅讨论这一点。为了完整起见,我将包含重点内容和一些片段:
创建一个服务 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(); } }
根据响应的接口(interface)构造覆盖类型
创建客户端实用程序以将 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 + ')')
.调用 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/