0

我想为我在 GWT 中的位置创建一个标准的 Tokenizer。

为此,我想使用 json 格式。像这样的东西:

public String getToken(T place) {
  return transformToJSON(place);
}

public T getPlace(String token) {
  return (T)transformJSONToObject(token);
}

我找不到实现 transformToJSON 和 transformJSONToObject 的方法。我尝试使用 GWT 的 JSONParser,但它仅限于 JavascriptObject(并且 Places 不是 JavascriptObject)。

我怎样才能实现它?

4

2 回答 2

1

您真的想将 JSON 放入您的 URL 中吗?!

反正:

public String getToken(MyPlace place) {
   JSONObject obj = new JSONObject();
   obj.put("id", new JSONString(place.getId());
   return obj.toString();
}

public MyPlace getPlace(String token) {
   JSONObject obj = JSONParser.parseStrict(token).isObject();
   return new MyPlace(obj.get("id").isString().stringValue());
}

您可以使用 AutoBeans 实现相同的目的;在任何情况下:复制东西进出你的地方。

作为替代方案,您当然可以让您的 Place 由 JSONObject/AutoBean 支持:

class MyPlace extends Place {
   public static class Tokenizer implements PlaceTokenizer<MyPlace> {
      public String getToken(MyPlace place) {
         return myPlace.jsonObject.toString();
      }
      public Place getPlace(String token) {
         return new MyPlace(JSONParser.parseStrict(token).isObject());
      }
   }

   private final JSONObject jsonObject;

   public MyPlace() {
      this(new JSONObject());
   }

   public MyPlace(JSONObject jsonObject) {
      this.jsonObject = jsonObject;
   }

   public String getId() { return jsonObject.get("id").isString().stringValue(); }

   public void setId(String id) { jsonObject.put("id", new JSONString(id)); }
}

注意:以上所有方法都使用 AutoBeans 效果更好;错误处理是一个带有 JSONObject 的 PITA,它也不能生成非常可读的代码。

如果你有很多地方,某种代码生成器可以在这里提供帮助。

于 2012-04-10T16:25:23.633 回答
0

这是如何使用 GWT 将任何对象(反)序列化为 JSON 的方法。

1) 使用受保护的构造函数定义扩展 JavaScriptObject 的类

public class PlaceData extends JavaScriptObject {

    public PlaceData () {
    }

}

2) 为字段添加原生 getter 和 setter

    public final native String getId() /*-{
        return this.id;
    }-*/;

    public final native String getToken() /*-{
        return this.token;
    }-*/;

3)定义某处映射方法,如那些

public static getPlace(PlaceData placeData) {
    Place place = new Place();
    place.setToken(placeData.getToken());
    place.setId(placeData.getId());
    return place; }

public static getPlaceData(Place place) {
    PlaceData placeData = new PlaceData();
    placeData.setToken(place.getToken());
    placeData.setId(place.getId());
    return placeData; }

4) 并将字符串转换为 JavaScriptObject 使用本机 eval() 函数。

public static native JsArray<PlaceData> jobs(String jsonArray) /*-{
    return eval(json);
}-*/;

public static native PlaceData objects(String jsonPlace) /*-{
    return eval(json);
}-*/;
于 2012-04-10T10:08:56.427 回答