Проблемы с процессором JSON в JSON - PullRequest
1 голос
/ 09 февраля 2011

Я часами ломал голову над этим:

Джексон десериализует B, но бомбы на C ниже:

B и C являются подклассамиA и, таким образом, имеет установщик getName.Обратите внимание, что верхний регистр N в Name является намеренным, именно так выглядит мой JSON.При десериализации C жалуется на нераспознанное имя поля Name, для B все нормально.

Версия 1.7.2

ObjectMapper mapper = new ObjectMapper();
mapper.getDeserializationConfig().addMixInAnnotations(B.class, MixIn.class);
String json = "{\"Name\" : \"13\"}";
B b = m.readValue(json, B.class);
System.out.println(b.getName());
C c = m.readValue(json, C.class);
System.out.println(c.getName());

 public class A {
    private int id ;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

public class B extends A {
private String address;

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
    }
}

 public class C extends A {
    private String country;

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
 }

 @JsonAutoDetect(fieldVisibility = Visibility.NONE,setterVisibility=Visibility.ANY)
 abstract class MixIn  {

    @JsonProperty("Name")
    public abstract void setName(String name);

    @JsonProperty("Id")
    public abstract void setId(int id);

 }

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

Это потому, что имя поля JSON по умолчанию для соответствия установщику с именем setName равно name, а не Name.Это соглашение об имени свойства Java.

Десериализация работает для B, потому что вы ввели миксин, который изменяет имя поля, совпадающее с setName.

Не можете ли выпросто введите миксин для C также?

1 голос
/ 09 февраля 2011

Вы только добавили аннотации с заглавными буквами в B.

mapper.getDeserializationConfig().addMixInAnnotations(B.class, MixIn.class);

Чтобы заставить работать C, нужно сделать то же самое и для C.

mapper.getDeserializationConfig().addMixInAnnotations(C.class, MixIn.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...