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

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格式的数据,数据格式如下:

数据类型 说明
JSONArray JSONValue构成的数组类型
JSONBoolean JSON boolean值
JSONException 访问JSON结构的数据出错的情况下可以抛出此异常
JSONNull JSON Null根式的数据
JSONNumber JSON Number类型的数据
JSONObject JSON Object类型的数据
JSONParser 将String格式的JSON数据解析为JSONValue类型的数据
JSONString JSON 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数据,正确的显示

同上

posted @ 2008-05-23 09:49  dainiao01  阅读(968)  评论(0编辑  收藏  举报