3

Jackson を使用した Json デシリアライズについて質問があります。次のようなクラスを使用してJsonファイルを逆シリアル化したいと思います:( http://wiki.fasterxml.com/JacksonInFiveMinutesから取得)

public class User 
{
    public enum Gender { MALE, FEMALE };
    public static class Name {
      private String _first, _last;
      public String getFirst() { return _first; }
      public String getLast() { return _last; }
      public void setFirst(String s) { _first = s; }
      public void setLast(String s) { _last = s; }
    }
    private Gender _gender;
    private Name _name;
    private boolean _isVerified;
    private byte[] _userImage;
    public Name getName() { return _name; }
    public boolean isVerified() { return _isVerified; }
    public Gender getGender() { return _gender; }
    public byte[] getUserImage() { return _userImage; }
    public void setName(Name n) { _name = n; }
    public void setVerified(boolean b) { _isVerified = b; }
    public void setGender(Gender g) { _gender = g; }
    public void setUserImage(byte[] b) { _userImage = b; }
}

Json ファイルは、いわゆる「フル データ バインディング」を使用して、次のように逆シリアル化できます。

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(new File("user.json"), User.class);

私の問題は、内部クラス「名前」の使用です。内部クラスを使用せずに同じことをしたいと思います。「ユーザー」クラスは次のようになります。

import Name;
import Gender;
public class User 
{
    private Gender _gender;
    private Name _name;
    private boolean _isVerified;
    private byte[] _userImage;
    public Name getName() { return _name; }
    public boolean isVerified() { return _isVerified; }
    public Gender getGender() { return _gender; }
    public byte[] getUserImage() { return _userImage; }
    public void setName(Name n) { _name = n; }
    public void setVerified(boolean b) { _isVerified = b; }
    public void setGender(Gender g) { _gender = g; }
    public void setUserImage(byte[] b) { _userImage = b; }
}

これは、逆シリアル化を実行するために必要なすべてのクラスをマッパーに指定する方法を見つけることを意味します。

これは可能ですか?ドキュメントを見ましたが、解決策が見つかりません。

私が必要としているのは、Javassist ライブラリを使用してそのようなクラスを作成し、内部クラスまたは匿名クラスをサポートしていないという事実から来ています。

前もって感謝します

4

2 に答える 2

6

Namestatic inner classと同名の最上位クラスに違いはないはずです。Jackson ランタイムは、2 つの状況を有意に区別できないはずです。

Nameクラスを から移動しUserて、トップレベル クラスに変更しようとしましたか? 以前と同じように動作するはずです。

編集:これを試したところ、名前がトップレベルのクラスの場合は正常に動作します。この例では、簡潔にするために内部クラスとしてそれを持っていたと思います。

于 2010-04-05T11:28:19.613 に答える
1

氏。Skaffman の答えは正しい。言及する唯一の追加事項は、JAXB とは異なり、Jackson は通常、ルート クラスを除いて、操作対象のクラスを指定する必要がないことです (また、 Polymorphic Handlingを使用する場合は常にそうであるとは限りません)。

于 2010-04-05T19:09:57.727 に答える