您的位置:首页 > Web前端 > JavaScript

GWT与JSON(使用JSON格式的数据通讯)

2008-05-23 09:49 447 查看
JSON 是什么?
JSON 的全称是JavaScript Object Notation,是一种轻量级的数据交换格式。JSON与XML具有相同的特性,例如易于人编写和阅读,易于机器生成和解析。但是JSON比XML数据 传输的有效性要高出很多。JSON完全独立与编程语言,使用文本格式保存。

JSON数据有两种结构:

Name-Value 对构成的集合,类似于Java中的Map。

Value的有序列表,类似于Java中的Array。

一个JSON格式的数据示例:
{
"Name": "Apple",
"Expiry": "2007/10/11 13:54",
"Price": 3.99,
"Sizes": [
"Small",
"Medium",
"Large"
]
}

更多关于JSON数据格式的说明参看JSON官方网站:http://www.json.org(中文内容参看:http://www.json.org/json-zh.html

GWT与JSON
GWT中支持的客户端服务器端方法调用和数据传递的标准格式是RPC。 JSON并不是GWT支持的标准的数据传递格式。那么如何使用JSON来作为GWT的数据传递格式呢?需要以下几步。
第一,引用HTTP和JSON支持。
第二,在客户端创建JSON数据,提交到服务器
第三,在服务器上重写数据格式解析的代码,使之支持JSON格式的数据
第四,在服务器上组织JSON格式的数据,返回给客户端。
第五,客户端解析服务器传回的JSON数据,正确的显示

引用HTTP和JSON支持
找到.gwt.xml文件,在其中的
<inherits name='com.google.gwt.user.User'/>
在之后添加如下的内容:
<inherits name="com.google.gwt.json.JSON"/>
<inherits name="com.google.gwt.http.HTTP"/>
其中com.google.gwt.json.JSON指的是要使用JSON,com.google.gwt.http.HTTP值得是通过HTTP调用服务器上的服务方法。

客户端构造JSON数据
客户端需要使用com.google.gwt.json.client包内的类来组装JSON格式的数据,数据格式如下:

数据类型说明
JSONArrayJSONValue构成的数组类型
JSONBoolean JSON boolean值
JSONException 访问JSON结构的数据出错的情况下可以抛出此异常
JSONNull JSON Null根式的数据
JSONNumber JSON Number类型的数据
JSONObject JSON Object类型的数据
JSONParser 将String格式的JSON数据解析为JSONValue类型的数据
JSONStringJSON String类型的数据
JSONValue所有JSON类型值的超级类型
组合一个简单的JSON数据:
JSONObject input = new JSONObject();
JSONString value = new JSONString("mazhao");
input.put("name", value);

JSON数据格式为:{name: "mazhao"}

组合一个包含数组类型的复杂JSON数据:
JSONObject input = new JSONObject();
JSONString value = new JSONString("mazhao");
input.put("name", value);
JSONArray arrayValue = new JSONArray();
arrayValue.set(0, new JSONString("array item 0"));
arrayValue.set(1, new JSONString("array item 1"));
arrayValue.set(2, new JSONString("array item 2"));
input.put("array", arrayValue);

JSON数据格式为:
{name: "mazhao",
array: {"array item 0", "array item 1", "array item 2"}}

注意上述的JSON类型的数据,使用的都是com.google.gwt.json.client包内的类型。这些类型最终会被编译为JavaScript执行。

服务端重写数据解析代码,支持JSON格式的数据
在服务器上,需要使用JSON Java支持类才能将JSON格式的数据转换为各种类型的数据,当然也可以自己写一些解析用的代码。这里我们使用了www.json.org上的代码来完成。这组代码与com.google.gwt.json.client的代码很相似,只是在org.json包内部。
怎么解析JSON术诀呢?针对上述中的复杂的JSON数据:
{name: "mazhao",
array: {"array item 0", "array item 1", "array item 2"}}

可以使用如下的方式解析:
JSONObject jsonObject = new JSONObject(payload);
String name = jsonObject.getString("name");
System.out.println("name is:" + name);
JSONArray jsonArray = jsonObject.getJSONArray("array");
for(int i = 0; i < jsonArray.length(); i++) {
System.out.println("item " + i + " :" + jsonArray.getString(i));
}
其中payload指的是上述的JSON格式的数据。

那么如何写GWT 的Service来得到Payload的数据呢?需要两点,第一,需要建立一个Service类,第二,覆盖父类的processCall方法。
示例代码:
package com.jpleasure.gwt.json.server;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.jpleasure.gwt.json.client.HelloWorldService;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by IntelliJ IDEA.
* User: vaio
* Date: 2007-9-4
* Time: 22:08:31
* To change this template use File | Settings | File Templates.
*/
public class HelloWorldServiceImpl extends RemoteServiceServlet implements HelloWorldService {
public String processCall(String payload) throws SerializationException {
try {
JSONObject jsonObject = new JSONObject(payload);
String name = jsonObject.getString("name");
System.out.println("name is:" + name);
JSONArray jsonArray = jsonObject.getJSONArray("array");
for(int i = 0; i < jsonArray.length(); i++) {
System.out.println("item " + i + " :" + jsonArray.getString(i));
}
} catch (JSONException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return "success";
}
}

在服务器上组织JSON格式的数据,返回给客户端
同上

客户端解析服务器传回的JSON数据,正确的显示
同上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: