59

GWTで動作する可能性のあるJava用の単純なJson(デ)シリアライザーを探しています。私は少しグーグルして、すべてのメンバーに注釈を付けるか、役に立たないインターフェースを定義する必要があるいくつかの解決策を見つけました。かなり退屈です。こんなにシンプルなものを作ってみませんか

class MyBean {
    ...
}

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

13 に答える 13

56

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());
于 2009-04-10T07:03:13.610 に答える
38

もう 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)ください。

于 2011-02-17T21:44:53.730 に答える
12

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

次のように簡単です。

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

JSONValue API は非常に優れています。これにより、JSON オブジェクトから値を抽出するときに検証をチェーンできるため、形式に問題がある場合に例外がスローされます。

于 2010-07-17T05:04:08.573 に答える
11

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

GWTでのBeanからjsonへの変換とjsonからBeanへの変換は簡単な作業ではないことがわかりました。GWTは完全なソースコードを必要とし、このソースコードはGWTによってエミュレートされたJavaクラスのみを使用する必要があるため、既知のライブラリは機能しません。また、GWTではリフレクションを使用できません。非常に厳しい要件!

私はgwt-jsonizerという名前の唯一の既存のソリューションを見つけました。カスタムGeneratorクラスを使用し、「jsonable」Beanごとにサテライトインターフェイスが必要です。残念ながら、最新バージョンのGWTにパッチを適用しないと機能せず、長い間更新されていません。

それで、私は個人的に、自分のBeanを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組み込みクラスです。

于 2009-03-26T08:05:45.720 に答える
6

RestyGWTは、GWT で Java オブジェクトを JSON にエンコードまたはデコードするための強力なライブラリです。

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 もいくつかあります。

よいひとときを。

于 2012-12-15T11:57:28.680 に答える
5

これをチェックして:

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

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

于 2010-04-01T07:13:57.993 に答える
3

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

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

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

于 2010-12-16T17:11:45.210 に答える
2

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

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

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

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

したがって、これはすぐに使用できるソリューションではありませんが、GWTに適合するJSONシリアライザーを構築するための優れた出発点です。これをサーバー側のjson-libなどのJSONシリアライザーと組み合わせると、準備が整います。

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

于 2009-11-17T17:58:27.910 に答える
1

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

Java で JSON 形式を読み書きする必要がある場合は、このツールを使用してください。追加のクラスなどを作成する必要はありません。1 回の呼び出しで Java オブジェクト グラフを JSON 形式に変換します。逆に、JSON String または Stream to Java オブジェクトを作成します。これは、これまでに見た中で最速のライブラリです。ほとんどの場合、バイナリ形式を使用する ObjectOutputStream および ObjectInputStream よりも高速です。

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

于 2010-10-21T21:07:25.110 に答える
1

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

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

適切なチュートリアルは、おそらくディレクトリのトップ レベルにあるREADMEです。標準の GWT RPC に非常に似ていますが、JSON エンコーディングを使用します。XSRF 保護も組み込まれています。

于 2011-04-06T14:31:43.443 に答える
0

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

code.google.com にUsing GWT for JSON Mashupsというタイトルのページがあります。私は GWT にあまり詳しくないので (残念ながら) 頭がいっぱいで、役に立たないかもしれません。

于 2009-03-25T21:04:59.897 に答える
-1

OK、以前の回答を削除しました。それはまさにあなたが望まないものであることが判明したためです。

GWT でどの程度うまく機能するかはわかりませんが、私が働いている通常の Java プロジェクトでは、 json-libライブラリを使用してオブジェクトをシリアル化しています。

JavaBean から直接 JSONObjectを作成し、結果の JSONObject の toString() メソッドを使用して実際の JSON 文字列を取得できます。

同様に、 JSON を JavaBean に戻すこともできます。

于 2009-03-25T20:11:14.253 に答える
-1

ジャクソンがあなたのために働くかどうかわからない. あなたが探しているGWT固有のものがあるかどうかはわかりません。そうでない場合は機能するはずです。

しかし、そのシリアライゼーション/デシリアライゼーションは、次のように非常にうまく機能します。

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

アクセサー (シリアル化、逆シリアル化、メソッドに他の名前で注釈を付けることができます) が必要ですgetX()setX()、それだけです。

于 2009-03-26T02:45:44.583 に答える