Десериализовать списки и объекты в одну структуру с Джексоном - PullRequest
1 голос
/ 04 марта 2020

В качестве входных данных для моего приложения я могу получить либо один JsonObject, либо их список:

input1 = [ { "prop": "val1" }, { "prop": "val2" } ]
input2 = { "prop": "val" }

Я могу использовать JsonNode в качестве целевого типа для обоих входов

objectMapper.readValue(input1, JsonNode.class);
objectMapper.readValue(input2, JsonNode.class);

И затем оцените, является ли root узел ArrayNode или ObjectNode.

. Я ищу способ определить мой пользовательский целевой тип, например List<MyObject>, который имеет один элемент, если JsonObject предоставляется, или от нуля до нескольких, если предоставляется список.

objectMapper.readValue(input, new TypeRef<ArrayList<MyObject>>() {});

однако не удается для одного объекта - он не может создать c Array-Type из {.

Я пытался создать свой собственный тип:

public class MyList extends ArrayList<MyObject> {
    public String prop;

    @JsonCreator
    public MyList(String prop) {
        super();
        this.prop = prop; // Resp add(new MyObject(prop));
    }

    public MyList() {}
}

Но Джексон отказывается использовать JsonCreator для отдельных объектов.

Есть ли способ, который я мог бы сделать (в идеале без специального сериализатора Если только это не может быть сделано довольно обобщенно c)

1 Ответ

0 голосов
/ 05 марта 2020

Конечно, у Джексона есть простое решение для этого:
DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY в вашу помощь!

@EqualsAndHashCode
public class Example {
    @JsonProperty public String name
}

@Test
public void experiment() {
    ObjectMapper om = new ObjectMapper();
    om.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

    String list= "[{ \"name\": \"peter\" }]";
    String single= "{ \"name\": \"peter\" }";

    List<Example> respList = om.readValue(list, new TypeReference<List<Example>>() {});
    List<Example> respSingle = om.readValue(single, new TypeReference<List<Example>>() {}); 
    Assert.assertEquals(respList, respSingle)
}
...