1

名前の変更や除外などの圧縮を行いながら、JavaオブジェクトをJSONにシリアル化する必要があります。オブジェクトはjarのクラスを使用しますが、そのソースコードは利用できません。

多くのライブラリ(JacksonGson)を調べましたが、この特定の問題を解決するものは見つかりませんでした。それらのほとんどは注釈ベースであり、ソースコードがないため使用できません。

この問題を解決する1つの方法は、リフレクションを使用して、置換する必要のあるプロパティ名が見つかるまで、またはシリアル化されたJSONでオブジェクトが除外されるまで、オブジェクトを再帰的に調べることです。

このための解決策が必要です。すでに実装およびテストされている場合は、より適切です。

4

2 に答える 2

2

Gensonライブラリhttp://code.google.com/p/genson/もご覧ください。

非常に簡潔なコードで名前を変更してフィルタリングできます。

// renames all "fieldOfName" to "toName", excludes from serialization 
// and deserialization fields named "fieldNamed" and declared in DefinedInClass
// and uses fields with all visibility (protected, private, etc)

Genson genson = new Genson.Builder().rename("fieldOfName", "toName")
                                    .exclude("fieldNamed", DefinedInClass.class)
                                    .setFieldFilter(VisibilityFilter.ALL)
                                    .create();

genson.serialize(myObject);
  • より複雑なフィルタリング(たとえば、アノテーションに基づく)を実行する場合は、BeanMutatorAccessorResolverを実装するか、 BaseResolverを拡張できます。

  • プロパティの名前変更についても同じで、 PropertyNameResolverを実装して、完全に制御できます。

  • 最後に、修飾子に従ってフィールド、メソッド、またはコンストラクターをフィルター処理する場合は、独自のVisiblityFilterを定義できます。

  • フィルタリング/名前変更のパフォーマンスに関しては、クラスごとに1回だけ実行されてからキャッシュされるため、問題はありません。

Gensonの使用を開始するには、スタートガイドをご覧ください。

于 2012-10-02T15:01:35.657 に答える
0

問題の解決策が見つかりました。

Google gsonには、除外戦略命名戦略のメソッドを持つGsonBuilderというクラスがあります。

これらの2つの方法を使用して、カスタムソリューションを実装しました。このソリューションでは、すべてのマッピングルールと除外ルールがxmlを使用して保存され、シリアル化と逆シリアル化のときに使用されます。

同じパフォーマンスについてはわかりませんが、完全に機能します。

于 2012-10-01T14:13:54.363 に答える