用Jackson解析非均匀JSON对象数组

时间:2020-02-20 22:13:23

标签: java json jackson

我遇到一种情况,我需要解析一个不相同的JSON对象数组。

例如:

sd

类型的数量是有限的,每种类型的内容都可以定义,但是无法定义将容纳内容的对象的单一类型。

有没有办法和杰克逊一起解析它们?

P.S。如果可以,我会尽量避免编写自定义解析器。

2 个答案:

答案 0 :(得分:2)

我会使用

TIn

com.fasterxml.jackson.databind.JsonNode

此类有大量实用工具可以使用。

您可以使用特定于数组的信息:

JsonNode parsed = objectMapper .readValue("[{\"name\": \"a\"},{\"type\":\"b\"}]", JsonNode.class);

com.fasterxml.jackson.databind.node.ArrayNode

编辑

对不起,我没有看清您的问题,您可以使用ArrayNode value = objectMapper .readValue("[{\"name\": \"a\"},{\"type\":\"b\"}]", ArrayNode.class); 进行多态序列化/反序列化:

@JsonTypeInfo

以下是文档:

https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization

希望这会有所帮助。

结果将是:

public static void main(String args[]) throws JsonProcessingException {

    //language=JSON
    String data = "[{\"type\":\"type1\", \"type1Specific\":\"this is type1\"},{\"type\":\"type2\", \"type2Specific\":\"this is type2\"}]";
    ObjectMapper objectMapper = new ObjectMapper();

    List<BaseType> parsed = objectMapper.readValue(data, new TypeReference<List<BaseType>>() {});
    System.out.println(parsed);
}


@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes(value = {
        @JsonSubTypes.Type(value = Type1.class, name = "type1"),
        @JsonSubTypes.Type(value = Type2.class, name = "type2")
})
static public abstract class BaseType {
    public String type;
}
static public class Type1 extends BaseType {
    public String type1Specific;
    @Override
    public String toString() {
        return "Type1{" +
                "type1Specific='" + type1Specific + '\'' +
                '}';
    }
}
static public class Type2 extends BaseType {
    public String type2Specific;

    @Override
    public String toString() {
        return "Type2{" +
                "type2Specific='" + type2Specific + '\'' +
                '}';
    }
}

答案 1 :(得分:0)

我们可以使用List.class将此JSON数组与保存内容的不同类型的对象进行映射。它将返回LinkedHashMaps列表。不同的内容将映射到LinkedHashMap。

@Test
public void testLoadCustom() {
    String json = "[{\"a\":\"A\" } , {\"b\":\"B\" , \"c\":\"C\" } , {\"d\":\"D\" } ]";
    try {
        List custom = objectMapper.readValue(json, List.class);
        System.out.println(custom);
    } catch (Exception ex) {
        ex.getStackTrace();
    }
}


 // Output [{a=A}, {b=B, c=C}, {d=D}]