1

Bugzilla の Web サービスで動作する JSON インターフェイス/ライブラリを作成しています。

これは、注釈などを使用して可能ですか? それとも、このようなすべてのインスタンスに対してカスタム デシリアライザーを作成する必要がありますか?

いくつかの調査を試みたところ、Value Instantiator またはコンストラクターの使用に関する情報が見つかりましたが、コンストラクターの使用はアンチ Bean のようではありませんか? ドキュメントがまばらであるか、新しい機能では理解しにくいことがわかりました。

例:

public class Bug{
  // Bug info, strings, ints, yadda yadda.
 private User creator;   // creator of the bug, json is like   {"creator":"blahblah@email.com"}
}

public class User{
 private String username;
}
//insert setter/getter.

1 つのフィールドに pojo を使用する理由は、この User クラスがより多くのフィールドを持つ別のクラスによって拡張されるためです。この効果を実現するためにコンストラクターを実装できますが、そうすると、他のすべてのサブクラスに対して同じコンストラクターを実装する必要があります。@JsonValue に似たものがあるように感じますが、設定用です(セッターで JsonCreator を試しましたが、以下と同じエラーが発生しました)。

「型 [単純型、クラス ユーザー] の値を文字列値からインスタンス化できません。単一の文字列コンストラクター/ファクトリ メソッドはありません」

ありがとう。

4

2 に答える 2

2

デシリアライズには @JsonCreator を使用し、シリアライズには @JsonValue を使用します。コードをテストしました。getJsonString() が public メソッドであることを確認してください。

例えば:

public class User{
    private String username;

    @JsonValue
    public String getJsonString() {
         return username;
    }

    @JsonCreator
    private static User parseJson(String jsonStr) {
        User u = new User();
        u.username = jsonStr;
        return u;
    }

    public static void main(String[] args) {
        User u = new User();
        u.userName = "Niraj";

        ObjectMapper m = new ObjectMapper();
        String jsonString = m.writeValueAsString(u);
        User u1 = m.readValue(jsonString, User.class);
    }
}
于 2013-04-17T13:45:37.587 に答える