0

User.java にジェネリック フィールドがあります。json で T の値を使用したい。

public class User<T> {

public enum Gender {MALE, FEMALE};


private T field;
private Gender _gender;
private boolean _isVerified;
private byte[] _userImage;

public T getField() { return field; }
public boolean isVerified() { return _isVerified; }
public Gender getGender() { return _gender; }
public byte[] getUserImage() { return _userImage; }

public void setField(T f) { field = f; }
public void setVerified(boolean b) { _isVerified = b; }
public void setGender(Gender g) { _gender = g; }
public void setUserImage(byte[] b) { _userImage = b; }
}

マッパークラスは次のとおりです。

public class App 
{
public static void main( String[] args ) throws JsonParseException, JsonMappingException, IOException
{
    ObjectMapper mapper = new ObjectMapper();
    Name n = new Name();
    n.setFirst("Harry");
    n.setLast("Potter");
    User<Name> user = new User<Name>();
    user.setField(n);
    user.setGender(Gender.MALE);
    user.setVerified(false);

    mapper.writeValue(new File("user1.json"), user);
}
}

json出力は次のとおりです。

{"field":{"first":"Harry","last":"Potter"},"gender":"MALE","verified":false,"userImage":null}

出力では、フィールドの代わりに名前が表示されるようにします。それ、どうやったら出来るの。何か助けはありますか?

4

3 に答える 3

0

あなたが尋ねるのは、JSONのデフォルトの動作ではないと思います。フィールド名は、変数名ではなく、json マップの「キー」です。フィールドの名前を変更するか、文字列プロセスを作成してそれを行う必要があります。

于 2013-05-14T10:37:03.973 に答える
0

これを行うには、カスタム シリアライザーが必要です。これはランタイム データ変換であり、Jackson はカスタム シリアライザー以外のデータ変換をサポートしていません (値のラッピング/アンラッピングはありますが、そこには行きません)。また、シリアライザー内で適用するすべてのタイプの変換を事前に知っておく必要があります。以下の作品:

public class UserSerializer extends JsonSerializer<User<?>> {
    private static final String USER_IMAGE_FIELD = "userImage";
    private static final String VERIFIED_FIELD = "verified";
    private static final String FIELD_FIELD = "field";
    private static final String NAME_FIELD = "name";
    @Override
    public void serialize(User<?> value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
            JsonProcessingException {
        jgen.writeStartObject();
        if (value.field instanceof Name) {
            jgen.writeFieldName(NAME_FIELD);
        } else {
            jgen.writeFieldName(FIELD_FIELD);
        }
        jgen.writeObject(value.field);
        jgen.writeStringField("gender", value._gender.name());
        jgen.writeBooleanField(VERIFIED_FIELD, value._isVerified);
        if (value._userImage == null) {
            jgen.writeNullField(USER_IMAGE_FIELD);
        } else {
            jgen.writeBinaryField(USER_IMAGE_FIELD, value._userImage);
        }
        jgen.writeEndObject();
    }
}
于 2013-05-14T14:28:49.663 に答える