2012-04-10 5 views
0

私はGWTの私の場所に標準的なトークナイザーを作りたいと思っています。GWTでは、JSONをトークナイザで使用してPlaceをシリアル化/シリアル化解除するにはどうすればよいですか?

これを行うには、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ではありません)。

どうすれば実現できますか?

答えて

1

あなたは本当にあなたのURLにJSONを入れたいですか?とにかく

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を使用して同じことを達成することができます。いずれにしても、あなたの場所の中や外に物をコピーしてください。代替案として

、あなたはもちろん、あなたの場所は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であり、非常に読みやすいコードでもありません。

場所が多い場合は、何らかのコード生成プログラムが役立ちます。

+0

ありがとう、autobanの機能は私が必要とするものと正確に思われる –

0

GWTを使用してオブジェクトをJSONにシリアル化する方法を次に示します。

1))保護コンストラクタ

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ネイティブゲッターとセッターを追加してJavaScriptObjectを拡張するクラスを定義どこそれら

ようなマッピング方法を定義します
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); 
}-*/; 
+0

回答ありがとうございますが、私はそれを知っています。問題は、Place in GWTがjavascriptObjectではなく、抽象クラスPlaceを拡張する必要があることです。だからあなたの解決策はできません。 –

関連する問題