私はsimpleを探していますJavaのGWTで動作する可能性のあるJson(de)serializer。すべてのメンバーに注釈を付けるか、役に立たないインターフェースを定義する必要があるいくつかの解決策を見つけました。
class MyBean {
...
}
new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
GWTの Overlay Types を見てください。これは、GWTでJSONを使用する最も簡単な方法だと思います。リンクされた記事の修正されたコード例を次に示します。
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;
}-*/;
}
オーバーレイタイプを定義したら、JSONからJavaScriptオブジェクトを作成し、Javaでそのプロパティにアクセスするのは簡単です。
public static final native Customer buildCustomer(String json) /*-{
return eval('(' + json + ')');
}-*/;
オブジェクトのJSON表現が再度必要な場合は、JSONObjectでオーバーレイタイプをラップできます。
Customer customer = buildCustomer("{'Bart', 'Simpson'}");
customer.setFirstName("Lisa");
// Displays {"first_name":"Lisa","last_name":"Simpson"}
Window.alert(new JSONObject(customer).toString());
もう1つ試してみるのは、GWT 2.1で導入された新しい AutoBean フレームワークです。
Beanとそれらを販売するファクトリーのインターフェースを定義すると、GWTが実装を生成します。
_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");
}
_
AutoBeanCodex を使用して、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));
_
それらはサーバー側でも動作します— AutoBeanFactoryMagic.create(Beanery.class)
の代わりにGWT.create(Beanery.class)
を使用します。
最も簡単な方法は、GWTの組み込みJSON APIを使用することです。 ドキュメント です。そして、ここに 素晴らしいチュートリアル の使い方があります。
次のように簡単です。
String json = //json string
JSONValue value = JSONParser.parse(json);
JSONValue APIはかなりクールです。 JSONオブジェクトから値を抽出するときに検証を連鎖させることができるため、形式に問題がある場合は例外がスローされます。
質問に対する正しい答えを見つけたようです
GWTでのBeanからJSONへの変換とjsonからBeanへの変換は簡単な作業ではないことがわかりました。 GWTは完全なソースコードを必要とし、このソースコードはGWTによってエミュレートされたクラスJavaを使用する必要があります。また、GWTでリフレクションを使用することはできません。 !
gwt-jsonizer という名前の唯一の既存のソリューションが見つかりました。カスタム Generator クラスを使用し、「jsonable」Beanごとにサテライトインターフェイスが必要です。残念ながら、最新バージョンのGWTにパッチを適用しないと機能せず、長期間更新されていません。
だから、私は自分の豆をjsonとの間でどのように変換するのかを安くして速くすることを個人的に決定しました。このような:
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
は、低レベルのjsonサポートを提供するGWT組み込みクラスです。
RestyGWT は、GWTでJSONにオブジェクトをエンコードまたはデコードするための強力なライブラリですJava
import javax.ws.rs.POST;
...
public interface PizzaOrderCodec extends JsonEncoderDecoder<PizzaOrder> {
}
次に:
// 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);
また、Restful Webサービスを利用するための使いやすいAPIもいくつか用意されています。
よいひとときを。
これをチェックして:
GWT Professional JSONシリアライザー: http://code.google.com/p/gwtprojsonserializer/
!GWT 2.0以降で動作します!
最近json.org/JavaはGWTに含まれているようです:
gwt-servlet-deps.jar\org\json \
または、このプロジェクトは包括的なようです: http://code.google.com/p/piriti/
Google Web Toolkitアプリケーションの510〜522ページで、著者のRyan Dewsburyは、GWTコード生成を使用してXMLおよびJSONドキュメントとの間でシリアル化を行う方法を示しています。
ここからコードをダウンロード ;第10章のコードバンドルが必要な場合は、src/com/gwtapps/serializationパッケージを確認します。このコードのライセンスは表示されませんでしたが、作者にメールして彼の言うことを確認しました。彼が返信したらこれを更新します。
このソリューションの問題:
したがって、これはすぐに使えるソリューションではありませんが、GWTに適合するJSONシリアライザーを構築するための素晴らしい出発点です。それを json-lib のようなサーバー側のJSONシリアライザーと組み合わせれば、準備完了です。
また、 このプロジェクト が見つかりました(ここでも、マーカーインターフェイスが必要です)。
このプロジェクトをチェックアウトすることをお勧めします https://gerrit.googlesource.com/gwtjsonrpc/
これは、AndroidのコードレビューシステムであるGerritをサポートするために作成されたライブラリですが、Gerritだけでなく、GWTプロジェクトに埋め込むことを目的としたスタンドアロンモジュールです。
妥当なチュートリアルは、おそらくディレクトリの最上位にある [〜#〜] readme [〜#〜] です。標準のGWT RPCと非常に似ていますが、JSONエンコードを使用します。 XSRF保護も組み込まれています。
Google Codeからこのシリアライザーをお試しください: http://code.google.com/p/json-io/
JavaでJSON形式を読み書きする必要がある場合、これが使用するツールです。余分なクラスなどを作成する必要はありません。1回の呼び出しでJavaオブジェクトグラフをJSON形式に変換します。反対の操作-JSON文字列またはストリームをJava = objects。これは私がこれまでに見た中で最速のライブラリであり、ほとんどの場合、バイナリ形式を使用するObjectOutputStreamおよびObjectInputStreamよりも高速です。
非常に便利なユーティリティ。
私はこの質問にたくさん答えているようです...
Code-google.comに JSONマッシュアップにGWTを使用 というタイトルのページがあります。私はGWTにあまり詳しくないので、(残念ながら)頭の上の方法なので、役に立たないかもしれません。