Frage

Ich bin für eine einfach Json (de) Serializer für Java, die mit GWT funktionieren könnte. Ich habe ein wenig gegoogelt und fand einige Lösungen, die entweder jedes Mitglied mit Anmerkungen versehen erfordern oder nutzlos Schnittstellen definieren. Ziemlich langweilig. Warum gehen wir nicht haben etwas wirklich einfach wie

class MyBean {
    ...
}

new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
War es hilfreich?

Lösung

Werfen Sie einen Blick auf GWT Overlay-Typen . Ich denke, dies ist bei weitem der einfachste Weg ist, mit JSON in GWT zu arbeiten. Hier ist ein modifiziertes Codebeispiel aus dem verlinkten Artikel:

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;
    }-*/;
}

Wenn Sie den Overlay-Typ definiert haben, ist es einfach, ein JavaScript-Objekt von JSON und Zugriff auf seine Eigenschaften in Java zu erstellen:

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

Wenn Sie die JSON-Repräsentation des Objektes wieder wollen, können Sie das Overlay-Typ in einer JSONObject wickeln:

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

Andere Tipps

Eine andere Sache, um zu versuchen, ist der neue AutoBean Rahmen eingeführt mit GWT 2.1.

Sie definieren Schnittstellen für Ihre Bohnen und einer Fabrik, die sie vends und GWT erzeugt Implementierungen für Sie.

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

Die AutoBeanCodex können verwendet werden, um sie zur Serialisierung zu und von 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));

Sie arbeiten auf der Serverseite zu - verwenden AutoBeanFactoryMagic.create(Beanery.class) statt GWT.create(Beanery.class)

.

Es scheint, dass ich die richtige Antwort auf meine Frage

gefunden

Ich fand heraus, dass Bean json und json zu bean Umwandlung in GWT ist keine triviale Aufgabe. Bekannte Bibliotheken würde nicht funktionieren, weil GWT ihre vollständigen Quellcode erfordern würde und diese Quellcode muss nur Java-Klassen verwenden, die von GWT emuliert werden amoung. Auch Sie können nicht Reflexion in GWT verwenden. Sehr hohe Anforderungen!

fand ich die einzige existierende Lösung namens GWT-jsonizer . Es verwendet eine benutzerdefinierte Generator und Klasse erfordert einen Satelliten-Schnittstelle für jede „jsonable“ Bohne. Leider hat es nicht ohne auf die neueste Version von GWT arbeiten Patchen und wurde für eine lange Zeit nicht aktualisiert.

So entschied ich mich persönlich, dass es billiger und schneller ist, meine Bohnen zu machen Khow, wie sie sich konvertieren und von json. Wie folgt aus:

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 sind GWT integrierte Klassen, die Low-Level-json unterstützen.

RestyGWT ist eine leistungsstarke Bibliothek für die Codierung oder Decodierung Java-Objekt zu JSON in GWT:

import javax.ws.rs.POST;
...
public interface PizzaOrderCodec extends JsonEncoderDecoder<PizzaOrder> {
}

Dann:

// GWT will implement the interface for you
PizzaOrderCodec codec = GWT.create(PizzaOrderCodec.class);

// Encoding an object to json
PizzaOrder order = ... 
JSONValue json = codec.encode(order);

// decoding an object to from json
PizzaOrder other = codec.decode(json);

Es hat sich auch API mehrere einfache bekam verwenden für Restful Webdiensten.

Haben Sie eine schöne Zeit.

Überprüfen Sie dies:

GWT Professionelle JSON Serializer: http://code.google.com/p/gwtprojsonserializer/

! Funktioniert mit GWT 2.0 +!

json.org/java scheint in diesen Tagen mit GWT aufgenommen werden:

GWT-Servlet-deps.jar \ org \ json \

Oder scheint dieses Projekt den Anspruch auf Vollständigkeit: http://code.google.com/p/piriti/

Google Web Toolkit-Anwendungen, Seiten 510-522, der Autor, Ryan Dewsbury, zeigt, wie GWT Codegenerierung verwenden, um zu tun Serialisierung und von XML und JSON-Dokumenten.

Sie können laden Sie den Code hier ; Sie wollen das Kapitel 10 Code-Bundles und dann wollen Sie im src / com / gwtapps / Serialisierung Paket suchen. Ich habe nicht eine Lizenz für diesen Code sehen, aber haben den Autor per E-Mail, um zu sehen, was er sagt. Ich werde diese aktualisieren, wenn er antwortet.

Probleme mit dieser Lösung:

  • Sie haben einen Marker-Schnittstelle auf alle Ihre Objekte hinzufügen, die Sie serialisiert werden soll (er verwendet java.io.Serializable aber ich glaube, Sie andere verwenden könnte - wenn Sie für Ihre Back-End-Ruhezustand verwenden, könnte Ihr POJOs bereits markiert werden wie diese).
  • Der Code unterstützt nur String-Eigenschaften; es verlängert werden könnte.
  • Der Code ist nur für 1.4 und 1.5 geschrieben.

Also, das ist nicht ein aus der Box Lösung, aber ein guter Ausgangspunkt für jemanden einen JSON Serializer zu bauen, die mit GWT paßt. Kombiniert man dies mit einem JSON Serializer auf der Serverseite, wie Json-lib und Sie sind gut zu gehen.

Ich fand auch dieses Projekt (auch hier einige Marker-Schnittstelle ist erforderlich).

Versuchen Sie, diese Serializer von Google Code: http://code.google.com/p/ json-io /

Wenn Sie JSON-Format in Java schreiben oder zu lesen, das ist das Tool zu verwenden. Keine Notwendigkeit, zusätzliche Klassen zu erstellen, usw. konvertiert ein Java-Objekt Diagramm, um JSON-Format in einem Aufruf. Das Gegenteil tun - schaffen einen JSON String oder Stream auf Java-Objekte. Dies ist die schnellste Bibliothek, die ich noch nicht gesehen haben, dies zu tun. Es ist schneller als Object und Object in den meisten Fällen, die Binär-Format verwenden.

Sehr praktische Anwendung.

Sie möchten dieses Projekt zur Kasse https://gerrit.googlesource.com/gwtjsonrpc/

Es ist eine Bibliothek geschaffen, um ein Code-Review-System für Android zu unterstützen, Gerrit, aber es ist ein eigenständiges Modul eingebettet wird in einem beliebigen GWT Projekt gemeint, nicht nur Gerrit.

Ein vernünftiges Tutorial ist wahrscheinlich das README in der obersten Ebene der Verzeichnis. Es ist ganz ähnlich wie Standard-RPC GWT aber es nutzt JSON-Codierung. Es verfügt außerdem über integrierte in XSRF Schutz.

Ich scheine diese Frage viel zu beantworten ...

Es gibt eine Seite auf code.google.com betitelte GWT Verwendung für JSON Mashups . Es ist (leider) Art und Weise über den Kopf, als ich mit GWT nicht so vertraut bin, so kann es nicht hilfreich sein.

OK, löschte ich meine Antwort, weil es genau zu sein, stellte sich heraus, was Sie nicht wollen.

Ich weiß nicht, wie gut es mit GWT funktioniert, aber wir verwenden, um die Json-lib Bibliotheksobjekte in einem normalen Java-Projekt zur Serialisierung, wo ich arbeite.

Es kann erstellen JSONObject direkt aus einem JavaBean , dann die JSONObject toString resultierende () Methode, um den tatsächlichen JSON-String zurück.

Ebenso kann es auch drehen JSON zurück in eine JavaBean .

Nicht sicher, ob Jackson für Sie arbeiten würde. Ich weiß nicht, ob es GWT spezifische Sie suchen; wenn nicht sollte es funktionieren.

Aber seine Serialisierung / Deserialisierung funktioniert recht gut, wie:

// read json, create object
ObjectMapper mapper = new ObjectMapper();
MyBean bean = mapper.readValue(jsonAsString, MyBean.class);

// and write out
StringWriter sw = new StringWriter();
mapper.writeValue(sw, user);
String jsonOut = sw.toString();

Sie tun Accessoren (getX() zu serialisiert, setX() deserialisieren, können Methoden mit anderen Namen beschriften) benötigen, aber das ist es

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top