有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Jackson解析非同构JSON对象数组

在这种情况下,我需要解析不完全相同的JSON对象数组

例如:

[ 
 { "type": "type1", ..... type1 contents .... }, 
 { "type": "type2", ..... type2 contents .... },
 ....
 { "type": "type1", ..... type1 contents .... }
]

类型的数量是有限的,并且每个类型的内容都可以很好地定义,但是不可能定义一个单一类型的对象来保存内容

有没有办法和Jackson一起解析它们

另外,如果我能帮助的话,我会尽量避免编写自定义解析器


共 (2) 个答案

  1. # 1 楼答案

    我会用

    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进行多态序列化/反序列化:

    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 + '\'' +
                    '}';
        }
    }
    

    以下是文件:

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

    希望这有帮助

    结果是:

    [Type1{type1Specific='this is type1'}, Type2{type2Specific='this is type2'}]
    
  2. # 2 楼答案

    我们可以使用列表。类将此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}]