Джексон JSON Mixin десериализация - Массив с различными типами - PullRequest
1 голос
/ 19 августа 2011

У меня есть строка JSON, которая выглядит как

{"response":[125,{"id":219},{"id":212}]}

Итак, как вы можете видеть, «ответ» - это массив, состоящий из Number и 2 POJO (id: Number).

Не могли бы вы дать мне несколько советов, как десериализовать такие строки с помощью Jackson Mixins?Предположение, что каждая запись имеет тип POJO, не работает - Джексон генерирует исключение, потому что Number не является экземпляром POJO.На самом деле можно пропустить этот неприятный номер, который мне нужен только Список POJO.

Test.java

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new SimpleModule("VKontakteModule", new Version(1, 0, 0, null)) {
            @Override
            public void setupModule(SetupContext context) {
                context.setMixInAnnotations(VKontaktePost.class, VKontaktePostMixin.class);
                context.setMixInAnnotations(VKontaktePosts.class, VKontaktePostsMixin.class);
            }
        });
String str;
VKontaktePosts posts;
str = "{\"response\":[{\"id\":282},{\"id\":283}]}";
posts = objectMapper.readValue(deserStr, VKontaktePosts.class); //Works

str = "{\"response\":[125,{\"id\":282},{\"id\":283}]}";
posts = objectMapper.readValue(deserStr, VKontaktePosts.class); //Throws JsonMappingException: Can not construct instance of VKontaktePost, problem: no suitable creator method found to deserialize from JSON Number

VKontaktePosts.java

public class VKontaktePosts implements Serializable {

    private final List<VKontaktePost> posts;

    public VKontaktePosts(List<VKontaktePost> posts) {
        this.posts = posts;
    }

    public List<VKontaktePost> getPosts() {
        return posts;
    }

}

ВКонтактеPost.java

public class VKontaktePost {

    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

ВКонтактеPostsMixin.java

@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class VKontaktePostsMixin {

    @JsonCreator
    VKontaktePostsMixin(@JsonProperty("response") List<VKontaktePostMixin> posts) {
    }

    @JsonProperty("response")
    abstract List<VKontaktePostMixin> getPosts();

}

ВКонтактеPostMixin.java

@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class VKontaktePostMixin {

    @JsonProperty("id")
    abstract String getId();

}
...