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)フィールドのネイティブゲッターとセッターを追加します

    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 に答える