2012-04-10 1 views
0

Je voudrais créer un Tokenizer standard pour mes emplacements dans GWT.Dans GWT, comment sérialiser/désérialiser un lieu en utilisant JSON dans son tokenizer?

Pour ce faire, je voudrais utiliser le format json. Quelque chose comme ceci:

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

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

Je ne peux pas trouver un moyen de transformToJSON et met en œuvre transformJSONToObject. J'ai essayé d'utiliser le JSONParser de GWT mais c'est assez limité à JavascriptObject (et Places n'est pas JavascriptObject).

Comment puis-je l'atteindre?

Répondre

1

Vous voulez vraiment mettre JSON dans vos URL ?!

Quoi qu'il en soit:

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

Vous pouvez obtenir les mêmes en utilisant AutoBeans; dans tous les cas: copier des choses dans et hors de votre lieu.

Comme alternative, vous pouvez bien sûr avoir votre place être soutenu par un 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)); } 
} 

Note: Tous les travaux ci-dessus bien mieux avec AutoBeans; la gestion des erreurs est un PITA avec JSONObject, et il ne fait pas non plus de code très lisible.

Une sorte de générateur de code peut aider ici si vous avez beaucoup d'endroits.

+0

merci, la fonctionnalité autobean semble être exactement ce dont j'ai besoin –

0

Voici comment procéder pour (dé) sérialiser des objets à JSON avec GWT.

1) Définir la classe extension JavaScriptObject avec le constructeur protégé

public class PlaceData extends JavaScriptObject { 

    public PlaceData() { 
    } 

}

2) Ajouter getters indigènes et setter pour les champs

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

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

3) Définir quelque part les méthodes de cartographie comme celles

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) Et pour convertir une chaîne en JavaScriptObject, utilisez la fonction native eval().

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

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

Merci pour la réponse, mais je le sais. Le problème est que Place dans GWT doit étendre la classe abstraite Place et non javascriptObject. Donc, votre solution ne peut pas être faite. –

Questions connexes