GWT で動作する Json <-> Java シリアル化 [終了]
-
22-08-2019 - |
質問
を探しています 単純 GWT で動作する可能性のある Java 用の Json (de) シリアライザー。少しグーグルで調べたところ、すべてのメンバーに注釈を付けるか、役に立たないインターフェイスを定義する必要がある解決策がいくつか見つかりました。かなり退屈だ。次のような非常に単純なものを用意しないのはなぜでしょうか
class MyBean {
...
}
new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
解決
GWTのオーバーレイタイプを見てみましょう。私は、これははるかに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());
他のヒント
しようとするもう一つは、新しい AutoBean の枠組み導入され、 GWT 2.1と。
あなたは豆、それらを販売する工場のためのインタフェースを定義し、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を使用することです。ここでドキュメントのです。そして、ここでそれを使用する方法についての素晴らしいチュートリアルをrel="noreferrer"> href="http://gwttutorials.com/2009/07/27/parsing-json-with-gwt/"
これは、このような単純なのです。 JSONValue APIはかなりクールです。それは何の気を悪く形式の場合は、例外がスローされますように、あなたはJSONオブジェクトから値を抽出として、あなたが検証をチェーンできます。String json = //json string
JSONValue value = JSONParser.parse(json);
私は私の質問
に正しい答えを見つけたようです私は、GWT内のBeanへの変換JSONとJSONにBeanは簡単な作業ではないことを考え出しました。 GWTは、彼らの完全なソースコードを必要とし、このソースコードはamoung GWTでエミュレートされている唯一のJavaクラスを使用する必要がありますので、既知のライブラリが動作しないでしょう。また、あなたはGWTでリフレクションを使用することはできません。非常に厳しい要件!
私は GWT-jsonizer の命名のみ既存の解決策を見つけました。これは、カスタムジェネレータを使用していますのクラスと、各「jsonable」Beanの衛星インターフェースが必要です。残念ながら、それはGWTの最新バージョンにパッチを適用せずに動作しないと長い間更新されていない。
だから、私は個人的に私の豆はJSONにしてから身を変換する方法khow作るために安価かつ迅速であることを決定しました。このように:
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
GWTは、内蔵されている低レベルのJSONのサポートを提供するクラスます。
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プロフェッショナルJSONシリアライザ: http://code.google.com/p/gwtprojsonserializer/する
!GWT 2.0 +で動作します!
json.org/javaは、これらの日GWTに含まれているように見えるます:
GWT-サーブレットdeps.jar \ ORG \ JSON \
それとも、このプロジェクトは、包括的であると思われます。 http://code.google.com/p/piriti/する
『Google Web Toolkit Applications』の 510 ~ 522 ページでは、著者の Ryan Dewsbury が、GWT コード生成を使用して XML および JSON ドキュメントとの間でシリアル化を行う方法を示しています。
あなたはできる ここからコードをダウンロードしてください;第 10 章のコード バンドルが必要で、次に src/com/gwtapps/serialization パッケージを調べます。このコードのライセンスは見当たりませんでしたが、作者にメールして内容を確認しました。彼が返信したら、これを更新します。
このソリューションの問題点:
- シリアル化したいすべてのオブジェクトにマーカー インターフェイスを追加する必要があります (彼は java.io.Serializable を使用していますが、他のものを使用できると思います。バックエンドに Hibernate を使用している場合、pojo はすでにこのようにタグ付けされている可能性があります)。 。
- コードは文字列プロパティのみをサポートします。延長される可能性があります。
- コードは 1.4 と 1.5 用にのみ記述されています。
したがって、これはすぐに使えるソリューションではありませんが、GWT に適合する JSON シリアライザーを構築するための優れた出発点となります。それをサーバー側の JSON シリアライザーと組み合わせます。 json-lib 大丈夫です。
私も見つけました このプロジェクト (ここでも、いくつかのマーカー インターフェイスが必要です)。
はGoogle Codeからこのシリアライザを試してみてください: http://code.google.com/p/ JSON-IO / の
あなたが書いたり、JavaでJSON形式を読み取る必要がある場合は、、これは、使用するツールです。などの余分なクラスを作成する必要はありません、誰の呼び出しでJSON形式にJavaオブジェクトのグラフを変換します。逆を行います - JavaオブジェクトにJSON文字列またはストリームを作成します。これは私がこれを行うには、まだ見てきた最速のライブラリです。これは、バイナリ形式を使用して、ほとんどの場合、中にObjectOutputStreamおよびObjectInputStreamのよりも高速です。
非常に便利なユーティリティます。
あなたはこのプロジェクトをチェックアウトすることもできます https://gerrit.googlesource.com/gwtjsonrpc/
これは、Android、ゲリットのためのコードレビューシステムをサポートするために作成したライブラリだが、それはどんなGWTプロジェクトだけでなく、ヘリットに埋め込まれることを意図単体のモジュールです。
合理的なチュートリアルでは、おそらくのトップレベルにある README でありますディレクトリ。これは、標準的なGWTのRPCに非常に似ていますが、JSONエンコーディングを使用しています。また、内蔵されていXSRF保護ます。
私はこの質問をたくさん答えているように見える...
と題しcode.google.com上のページがあります JSONマッシュアップのためのGWTを<使用/ A>。私はGWTとその慣れていないよ、それが役立つことがないかもしれないように、それは、私の頭の上に(残念ながら)方法です。
それはあなたがしたくなかった正確に何であることが判明したのでOK、私は私の前の回答を削除します。
私はそれがGWTでどのように動作するかよくわかりませんが、我々は JSON-libに私は仕事、通常のJavaプロジェクト内のオブジェクトをシリアル化するためのライブラリます。
これは使用し、その後、JavaBeanのするから直接JSONObjectを作成することができますバック、実際のJSON文字列を取得するために、JSONObjectのtoString()メソッドを結果ます。
同様に、それはまた、背中のJavaBean のに JSONを変えることができます。
のはあなたのために働くだろうジャクソンかどうかわかりません。 あなたが探している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()
、他の名前を持つメソッドに注釈を付けることができますが)必要があるのですが、それはそれについてです。