0

基本的に、できるだけ頭を悩ませずに JSON にシリアライズしたい Java オブジェクトがいくつかあります。現在、Tomcat、Jersey、Genson を使用しています。

Gensonでは、このようなものは機能しないことがわかりました(これはもちろんおもちゃの例です):

public class Main {
    public static void main(String[] args) {
        MyClass mc = new MyClass();
        mc.mapOfSets = new HashMap<>();
        Set<String> set0 = new HashSet<>();
        set0.add("0");
        Set<String> set1 = new HashSet<>();
        set1.add("1");
        set1.add("11");
        Set<String> set2 = new HashSet<>();
        set2.add("2");
        set2.add("22");
        set2.add("222");
        mc.mapOfSets.put("set0", set0);
        mc.mapOfSets.put("set1", set1);
        mc.mapOfSets.put("set2", set2);
        try {
            String json1 = new Genson().serialize(mc.mapOfSets);
            System.out.println(json1);
            String json = new Genson().serialize(mc);
            System.out.println(json);
        } catch (TransformationException | IOException e) {
            e.printStackTrace();
        }
    }
}

class MyClass {
    public Map<String, Set<String>> mapOfSets;
}

上記の出力は次のとおりです。

{"set1":["1","11"],"set0":["0"],"set2":["2","222","22"]}
{"mapOfSets":{"empty":false}}

Genson の優れた点は、WebContent フォルダーにドロップしただけで、Jersey にバンドルされていたものの代わりに使用されたことです。追加の構成は必要ありませんでした。上記のようなオブジェクトを取得して JSON にシリアル化するための、スキーマごとに何らかのコンバーターを作成する必要のない非常に簡単なアプローチがある場合、Genson の代わりに Jersey でそれを喜んで使用しますが、Genson は私を失敗させませんでした。欠点が遠い。

では、Genson に適切にシリアル化するように指示するにはどうすればよいでしょうか。または、この種のことを問題なく処理するライブラリとはどのようなものでしょうか?

ありがとう!

4

2 に答える 2

2

私はGensonsの作者です。確認したところ、これはバグです。この特定のケースを除いて、ジェネリックは Genson で正常に動作します...明日まで待っていただければ、修正といくつかのマイナーな新機能を含む新しいリリースを今夜プッシュします。完了したら、回答を更新します。

EDITバグが修正され、リリース 0.94 がパブリック Maven リポジトリにプッシュされました。最大 2 時間以内に利用可能になるはずです。このリリースでの変更点の一部を次に示します。試してみて、問題が解決するかどうかを確認してください。ありがとう :)

于 2013-02-05T08:53:35.910 に答える
0

私は依存性注入のニーズを処理するために Guice を使用しています。そのため、Jackson を私の Jersey プロジェクトに統合するのに苦労しました。Genson は私が望んでいたことをしていなかったので、もう一度 Jackson を試してみることにしました。SOとGoogleでさまざまな提案を試して、うまくいくまでいくつかのことを変えてみました。

そして今、次は私のサンドボックスプロジェクトで期待どおりの出力を提供します:

ObjectMapper mapper = new ObjectMapper();
AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
mapper.getSerializationConfig().setAnnotationIntrospector(introspector);
String jsonData = mapper.writeValueAsString(mc);
System.out.println(jsonData);

{"mapOfSets":{"set1":["1","11"],"set0":["0"],"set2":["2","222","22"]}}
于 2013-02-05T01:41:31.480 に答える