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

将列表和对象反序列化为与Jackson相同的结构

虞俊美
2023-03-14

作为我的应用程序的输入,我可能会得到一个JsonObject或它们的列表:

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

我可以使用JsonNode作为两个输入的目标类型

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

然后评估根节点是阵列节点还是对象节点。

我寻求一种方法来定义我的自定义目标类型,例如List

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

但是,对于单个对象失败-它无法从{构造数组类型。

我试图创建自己的类型:

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() {}
}

但Jackson拒绝将JsonCreator用于单个对象。

有没有办法,我可以做到这一点(理想情况下没有自定义序列化器,除非那个可以变得非常通用)


共有1个答案

鲁博雅
2023-03-14
匿名用户

当然,Jackson有一个简单的解决方案:反序列化功能。接受\u SINGLE\u VALUE\u AS\u 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)
}

 类似资料:
  • 我有一个抽象的超类A,我有几个具体的子类B,C,D 在序列化方面,我执行以下操作: 没问题。我现在想反序列化这个。我知道我不能实例化一个抽象类,那么这是如何实现的呢? 这不起作用: 编辑:我把这个添加到我的抽象超类中:(仍然没有运气) 再次编辑:我现在遇到以下错误: 看看JSON,@class不在那里。我怎样才能做到?我试过: 但这并没有奏效。有这方面的例子吗?如何告诉对象映射器对类使用我的注释?

  • 我试图通过Kotlin使用Jackson对lastfm api提供的xml进行反序列化。我用JAXB在Java中实现了这一点,我正在尝试移植它。除以下示例中的“未包装列表”字段外,所有功能都正常工作。我知道Track数据类正在工作,因为如果我使用而不是

  • 我有以下JSON文件要反序列化

  • 我有一个JSON字符串,它将空列表标记为而不是。因此,例如,如果我有一个没有子对象的对象,我将收到这样的字符串: 我想将其反序列化为父类,将子类正确设置为子类的空列表。 对于上面的JSON字符串,我想要一个将其id设置为13的对象,并将子元素设置为新的ArrayList 我知道如何为整个类使用注释 然后呢 但是,我想解决从字符串正确实例化列表的一般问题: 我能得到这样的东西吗?

  • 问题内容: 使用Spring Boot和Jackson,如何将包装/内部列表反序列化为直接在外部级别的列表? 例如,我有: 在JSON中,是; 下的列表。但我想将其解析为直接位于下方的名为列表的列表,而不是定义包含名为的列表的DTO 。 这可能吗?如何定义此DTO ? 问题答案: 看来这就是我所需要的。 https://www.baeldung.com/jackson- annotations @

  • 假设我有一个DTO类,如下所示: 现在我有一个返回MyDTO对象列表的API。但我想根据一些标准从这个对象列表中过滤掉并获取单个对象MyDTO。(比如属性1==一些值)。 我知道,在获得对象列表后,我可以使用流来实现这一点。但杰克逊有什么办法吗?因此,在我的fiegn客户端调用中,我可以将单个对象作为返回类型。 提前感谢!