2012-04-10 3 views
0

Ich möchte einen Standard-Tokenizer für meine Orte in GWT erstellen.In GWT, wie kann ich einen Ort mit JSON in seinem Tokenizer serialisieren/deserialisieren?

Um dies zu tun, möchte ich das JSON-Format verwenden. Etwas wie dieses:

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

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

Ich kann einen Weg finden, TransformToJSON und TransformJSONTOObject zu implementieren. Ich habe versucht, den JSONParser von GWT zu verwenden, aber es ist ziemlich auf JavascriptObject beschränkt (und Orte sind nicht JavascriptObject).

Wie kann ich es erreichen?

Antwort

1

Sie möchten JSON wirklich in Ihre URLs einfügen ?!

Wie dem auch sei:

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()); 
} 

Sie können dieselben mit AutoBeans erreichen; in jedem Fall: kopiere Dinge von und zu dir.

Als Alternative können Sie natürlich haben Ihren Platz durch eine JSONObject/AutoBean gesichert werden:

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)); } 
} 

Hinweis: Alle besser der oben genannten Arbeiten viel mit AutoBeans; Die Fehlerbehandlung ist eine PITA mit JSONObject und macht auch keinen sehr lesbaren Code.

Irgendeine Art von Code-Generator kann hier helfen, wenn Sie viele Orte haben.

+0

danke, das automatische Feature scheint genau das zu sein, was ich brauche –

0

Hier ist der Weg, wie Sie alle Objekte zu JSON mit GWT (de) serialisieren.

1) definieren Klasse JavaScriptObject mit geschützten Konstruktor verlauf

public class PlaceData extends JavaScriptObject { 

    public PlaceData() { 
    } 

}

2) In nativer Getter und Setter für Felder

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

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

3) definieren irgendwo Methoden Zuordnung wie jene

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) Und zum Konvertieren der Zeichenfolge in JavaScriptObject verwenden Sie die native Funktion eval().

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

public static native PlaceData objects(String jsonPlace) /*-{ 
    return eval(json); 
}-*/; 
+0

Danke für die Antwort, aber ich weiß das. Das Problem ist, dass Place in GWT die abstrakte Klasse Place und nicht javascriptObject erweitern muss. Ihre Lösung ist also nicht möglich. –

Verwandte Themen