web-dev-qa-db-ja.com

Json <-> Java GWTで動作するシリアル化

私はsimpleを探していますJavaのGWTで動作する可能性のあるJson(de)serializer。すべてのメンバーに注釈を付けるか、役に立たないインターフェースを定義する必要があるいくつかの解決策を見つけました。

class MyBean {
    ...
}

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

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());
55
Chris Kentfield

もう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)を使用します。

38
rjrjr

最も簡単な方法は、GWTの組み込みJSON APIを使用することです。 ドキュメント です。そして、ここに 素晴らしいチュートリアル の使い方があります。

次のように簡単です。

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

JSONValue APIはかなりクールです。 JSONオブジェクトから値を抽出するときに検証を連鎖させることができるため、形式に問題がある場合は例外がスローされます。

12
Eric Nguyen

質問に対する正しい答えを見つけたようです

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組み込みクラスです。

11
amartynov

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もいくつか用意されています。

よいひとときを。

6
Saeed Zarinfam

これをチェックして:

GWT Professional JSONシリアライザー: http://code.google.com/p/gwtprojsonserializer/

!GWT 2.0以降で動作します!

5

最近json.org/JavaはGWTに含まれているようです:

gwt-servlet-deps.jar\org\json \

または、このプロジェクトは包括的なようです: http://code.google.com/p/piriti/

3
Phaedrus

Google Web Toolkitアプリケーションの510〜522ページで、著者のRyan Dewsburyは、GWTコード生成を使用してXMLおよびJSONドキュメントとの間でシリアル化を行う方法を示しています。

ここからコードをダウンロード ;第10章のコードバンドルが必要な場合は、src/com/gwtapps/serializationパッケージを確認します。このコードのライセンスは表示されませんでしたが、作者にメールして彼の言うことを確認しました。彼が返信したらこれを更新します。

このソリューションの問題:

  • シリアル化するすべてのオブジェクトにマーカーインターフェイスを追加する必要があります(彼はJava.io.Serializableを使用しますが、他のものを使用できると思います。バックエンドにhibernateを使用している場合、pojoは既にこのようにタグ付けされている可能性があります) 。
  • コードは文字列プロパティのみをサポートしています。拡張することができます。
  • コードは1.4および1.5でのみ記述されています。

したがって、これはすぐに使えるソリューションではありませんが、GWTに適合するJSONシリアライザーを構築するための素晴らしい出発点です。それを json-lib のようなサーバー側のJSONシリアライザーと組み合わせれば、準備完了です。

また、 このプロジェクト が見つかりました(ここでも、マーカーインターフェイスが必要です)。

2
mooreds

このプロジェクトをチェックアウトすることをお勧めします https://gerrit.googlesource.com/gwtjsonrpc/

これは、AndroidのコードレビューシステムであるGerritをサポートするために作成されたライブラリですが、Gerritだけでなく、GWTプロジェクトに埋め込むことを目的としたスタンドアロンモジュールです。

妥当なチュートリアルは、おそらくディレクトリの最上位にある [〜#〜] readme [〜#〜] です。標準のGWT RPCと非常に似ていますが、JSONエンコードを使用します。 XSRF保護も組み込まれています。

1
Bruno Bossola

Google Codeからこのシリアライザーをお試しください: http://code.google.com/p/json-io/

JavaでJSON形式を読み書きする必要がある場合、これが使用するツールです。余分なクラスなどを作成する必要はありません。1回の呼び出しでJavaオブジェクトグラフをJSON形式に変換します。反対の操作-JSON文字列またはストリームをJava = objects。これは私がこれまでに見た中で最速のライブラリであり、ほとんどの場合、バイナリ形式を使用するObjectOutputStreamおよびObjectInputStreamよりも高速です。

非常に便利なユーティリティ。

1
John

私はこの質問にたくさん答えているようです...

Code-google.comに JSONマッシュアップにGWTを使用 というタイトルのページがあります。私はGWTにあまり詳しくないので、(残念ながら)頭の上の方法なので、役に立たないかもしれません。

0
Powerlord