当前位置: 首页 > 知识库问答 >
问题:

用Jackson分析非同质JSON对象数组

芮歌者
2023-03-14

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

所以例如:

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

类型的数量是有限的,可以很好地定义每种类型的内容,但无法定义将保存内容的单一类型的对象。

有没有办法用杰克逊来解析它们?

附言。如果可以的话,我试图避免编写自定义解析器。

共有2个答案

阎阳
2023-03-14

我们可以使用List.class将这个JSON数组与保存内容的不同类型的对象进行映射。它将返回LinkedHashMap列表。不同的内容将映射到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}] 
牛嘉谊
2023-03-14

我会使用

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'}]
 类似资料:
  • 我正在做一个项目,我正在与返回JSON响应的第三方服务集成。我正在使用Jackson将响应反序列化为JavaPOJO。响应是一个对象,它有几个Jackson能够轻松解析的简单字段。但是响应还包含一个带有单个条目的数组,该条目也是一个对象。当Jackson尝试反序列化它时,我得到了包含列表中单个条目的顶级对象,但是列表中单个条目的所有字段都是空的。知道我在这里做错了什么吗? 更新:将FAIL\u O

  • 我正在将Jackson从1.9.4升级到2.2.0。过渡非常顺利,只是我似乎无法对对象进行数组解析。在1.9.4中,我可以这样做: 在Jackson 2.2.0中,我得到了一个“无法解析方法”编译时错误。Jackson 1.9.4的ObjectMapper头文件包含以下JsonNodes的readValue方法: 和Jackson 2.2.0的头文件: 所以我需要从传递JsonNode切换到Jso

  • 问题内容: 我有一个包含对象的json数组的文件: [{“ test1”:“ abc”},{“ test2”:[1,2,3]}] 我希望使用Jackson的JsonParser来从此文件中获取输入流,并且在每次调用.next()时,我希望它从数组中返回一个对象,直到用完对象或失败为止。 这可能吗? 用例:我有一个带有json数组的大文件,其中填充有大量具有不同架构的对象。我想一次获得一个对象,以避

  • 我有一个任务解析Json到Java类。 我试图解析的Json片段有点像树结构。 这里的关键点是,参数值可以是字符串,也可以是参数名称/值对的另一个数组; 我想用杰克逊地图绘制器 这里的问题是我不知道如何在这里描述响应类,所以它可以被杰克逊自动解析。如果有可能的话。 Json:

  • 问题内容: 我很难找到一种方法来解析JSONArray。看起来像这样: 如果JSON的写法不同,我知道如何解析它(换句话说,如果我返回了json对象而不是对象数组)。但这就是我所必须拥有的。 *编辑:这是一个有效的json。我使用此json制作了一个iPhone应用,现在我需要在Android上使用它,但无法弄清楚。有很多示例,但是它们都是与JSONObject相关的。我需要JSONArray。

  • 问题内容: 我试图从JSON数组中获取每个JSON对象。我通过HTTP发布获得此数据。 我知道我的数据是什么样的: 我的示例代码和结构如下所示: 我不确定如何遍历JSON数组并获取JSON对象,然后仅使用JSON对象。 问题答案: 试试这个作为您的结构, 您的名称不正确,顶层名称也不正确。解码为a之后,您可以遍历切片以获取每个切片