59 votes

Json <-> La sérialisation Java qui fonctionne avec GWT

Je suis à la recherche d'un simple Json (de)sérialiseur pour Java, qui pourrait travailler avec GWT. J'ai googlé un peu et a trouvé des solutions qui requièrent l'annoter chaque membre ou de définir des interfaces inutiles. Assez ennuyeux. Pourquoi n'avons-nous pas quelque chose de vraiment simple comme

class MyBean {
    ...
}

new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)

56voto

Chris Kentfield Points 1542

Jetez un oeil à GWT de Types d'Incrustation. Je pense que c'est de loin le moyen le plus facile de travailler avec JSON dans GWT. Voici une modification de l'exemple de code à partir de l'article lié:

public class Customer extends JavaScriptObject {
    public final native String getFirstName() /*-{ 
        return this.first_name;
    }-*/;
    public final native void setFirstName(String value) /*-{
        this.first_name = value;
    }-*/;
    public final native String getLastName() /*-{
        return this.last_name;
    }-*/;
    public final native void setLastName(String value) /*-{
        this.last_name = value;
    }-*/;
}

Une fois que vous avez la superposition de type défini, il est facile de créer un objet JavaScript à partir de JSON et d'accéder à ses propriétés en Java:

public static final native Customer buildCustomer(String json) /*-{
    return eval('(' + json + ')');
}-*/;

Si vous voulez la représentation JSON de nouveau l'objet, vous pouvez enrouler le type d'incrustation dans un JSONObject:

Customer customer = buildCustomer("{'Bart', 'Simpson'}");
customer.setFirstName("Lisa");
// Displays {"first_name":"Lisa","last_name":"Simpson"}
Window.alert(new JSONObject(customer).toString());

38voto

rjrjr Points 449

Une autre chose à essayer est la nouvelle AutoBean cadre introduit avec GWT 2.1.

Vous de définir des interfaces pour les haricots et une usine qui distribue, et GWT génère des implémentations pour vous.

interface MyBean {
  String getFoo();
  void setFoo(String foo);
}

interface MyBiggerBean {
  List<MyBean> getBeans();
  void setBeans(List<MyBean> beans>;
}

interface Beanery extends AutoBeanFactory{
  AutoBean<MyBean> makeBean();
  AutoBean<MyBiggerBean> makeBigBean();
}

Beanery beanFactory = GWT.create(Beanery.class);

void go() {
  MyBean bean = beanFactory.makeBean().as();
  bean.setFoo("Hello, beans");
}

Le AutoBeanCodex peut être utilisé pour sérialiser et en json.

AutoBean<MyBean> autoBean = AutoBeanUtils.getAutoBean(bean);
String asJson = AutoBeanCodex.encode(autoBean).getPayload();

AutoBean<MyBean> autoBeanCloneAB = 
  AutoBeanCodex.decode(beanFactory, MyBean.class, asJson );

MyBean autoBeanClone = autoBeanCloneAB.as(); 
assertTrue(AutoBeanUtils.deepEquals(autoBean, autoBeanClone));

Ils fonctionnent sur le côté de serveur de trop utiliser AutoBeanFactoryMagic.create(Beanery.class) au lieu de GWT.create(Beanery.class).

12voto

Eric Nguyen Points 18126

La façon la plus simple serait d'utiliser GWT intégré dans l'API JSON. Voici la documentation. Et voici un bon tutoriel sur la façon de l'utiliser.

C'est aussi simple que cela:

String json = //json string
JSONValue value = JSONParser.parse(json);

Le JSONValue API est assez cool. Il vous permet de chaîne de validations que vous extrayez les valeurs de l'objet JSON de sorte que les exceptions seront jetés si quelque chose de mal avec le format.

11voto

amartynov Points 1591

Il semble que j'ai trouvé la réponse à ma question

J'ai compris que les grains de json et json pour le haricot de conversion en GWT n'est pas une tâche triviale. Connu bibliothèques ne marche pas car GWT faudrait leur code source complet et ce code source doivent utiliser uniquement des classes Java qui sont parmi émulé par GWT. Aussi, vous ne pouvez pas utiliser la réflexion dans GWT. Très difficile exigences!

J'ai trouvé la seule solution existante nommée gwt-jsonizer. Il utilise un personnalisé Générateur de classe et nécessite une interface satellite pour chaque "jsonable" bean. Malheureusement, il ne fonctionne pas sans la mise à jour corrective sur la dernière version de GWT et n'a pas été mis à jour depuis longtemps.

Donc, personnellement, j'ai décidé que c'est moins cher et plus rapide pour faire mes haricots khow comment convertir eux-mêmes et de json. Comme ceci:

public class SmartBean {
	private String name;

	public String getName() { return name; }
	public void setName(String value) { name = value;  }

	public JSONObject toJson() {
		JSONObject result = new JSONObject();
		result.put("name", new JSONString(this.name));
		return result;
	}
	public void fromJson(JSONObject value) {
		this.name = value.get("name").isString().stringValue();
	}

}

JSONxxxx sont GWT intégrés dans des classes à faible niveau de prise en charge de json.

5voto

Vérifiez ceci:

GWT Professionnel Sérialiseur JSON: http://code.google.com/p/gwtprojsonserializer/

!Fonctionne avec GWT 2.0+!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X