我在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的线程,但不是相反。
答案 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的教程,正在讨论这个问题。为了完整起见,我将包含亮点和一些片段:
创建一个提供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();
}
}
根据响应界面构建叠加层类型
创建客户端实用程序以将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 + ')')
调用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();
答案 1 :(得分:0)
我现在将JSON保存为共享包中的String。
我使用org.JSON来完成我在服务器上获取的内容以及客户端中的覆盖类型。
我将aJsonArray.getJSONObject(i).toString();
用于在将JSON字符串发送到客户端时获取它,并将其存储在我的可序列化字符串中,然后在客户端上调用我的本机覆盖类型函数。像魅力一样,但我不确定它是否是最好的方式。这似乎是唯一的。