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

Jackson列表反序列化。嵌套列表

赵星华
2023-03-14

我正在创建一个具有嵌套列表的API。Jackson似乎是一个创建对象的好工具,但我不太清楚如何嵌套列表,我想知道这是否可能。

我的对象看起来像这样。

public class Order {
    public String name;
    public List<Item> items;
}

我希望有一种方法可以将其映射到json,看起来像:

{
    name : "A name"
    items : { 
        elements : [{
            price : 30
        }]
    }
}

我们希望能够做到这一点,以便我们可以将属性添加到列表中。

共有3个答案

樊浩初
2023-03-14

您的JSON转换为:“名为items的对象属于一种类型,它具有名为elements的属性,这是某种类型的列表”。

因此,Item类只需要一个属性:

class Item {
    List<Something> getElements();
}

请注意,您的Java代码不会映射到您的JSON。您的Java类将映射到以下内容:

{
    "name" : "foo",
    "items" : [
        { /* encoded version of Item */ }
    ]
}
越安翔
2023-03-14

通常,最好将JSON结构精确地映射到Java。在您的情况下,您可以使用以下内容:

public class Order {
  public String name;
  public ItemList items;
}

public class ItemList {
  public List<Item> elements;

  // and any properties you might want...
}

或者,您也可以使用(相对)新的JsonFormat注释:

public class Order {
  public String name;
  public ItemList items;
}

// annotation can be used on propery or class
@JsonFormat(shape=Shape.OBJECT) // instead of Shape.ARRAY
public class ItemList extends ArrayList<Item>
{
   public Iterator<Item> getElements() { return this.iterator(); }

   public String getSomeAttribute() { ... }
}

强制ListCollection像POJO一样序列化,而不是正常的特殊处理。可能会有一些副作用,因为自省用于查找可能的访问器,但一般方法应该有效

闾丘诚
2023-03-14

您可以为列表编写自定义反序列化器

class ItemsJsonDeserializer extends JsonDeserializer<List<Item>> {

    @Override
    public List<Item> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        InnerItems innerItems = jp.readValueAs(InnerItems.class);

        return innerItems.elements;
    }

    private static class InnerItems {
        public List<Item> elements;
    }
}

现在,你必须通知Jackson将其用于你的财产。您可以这样做:

public class Order {
  public String name;
  @JsonDeserialize(using = ItemsJsonDeserializer.class)
  public List<Item> items;
}
 类似资料:
  • 我知道我可以创建一个单独的Report类,然后使用@JSONProperty将其嵌入到ReportResponse中。有没有一种方法可以避免这种情况,并用一个注释标记ReportResponse类,将它映射到JSON中的“Report”元素?

  • 问题内容: 我正在创建具有嵌套列表的API。杰克逊似乎是创建对象的好工具,但我还不太清楚如何嵌套列表,我想知道它是否可能。 我的对象看起来像这样。 我希望有一种将其映射到看起来像这样的json的方法: 我们希望能够做到这一点,因此我们可以将属性添加到列表中。 问题答案: 您可以为编写自定义解串器。请参见以下示例: 现在,您必须通知Jackson将其用于您的财产。您可以通过以下方式执行此操作:

  • 我有以下xml 我需要将其反序列化为以下POJO: 这里的问题是被包装在元素中

  • 我想将json反序列化到类Foo: IBar有两个实现,但是当反序列化时,我总是想使用第一个实现。(理想情况下,这将使问题变得更容易,因为不需要运行时类型检查) 我相信我可以编写自定义反序列化程序,但我觉得一定有更简单的方法。 我找到了这个注释,它在没有列表的情况下非常有效。

  • 我想为我们的REST API实现一个自定义的反序列化器,它不仅被Java应用程序使用。因此,我不想让Jackson将类型信息放入序列化的JSON中。 我目前正在努力反序列化<code>CollectionExpand</code>,因为它包含特定<code>ResourceModel</code>的<code>数据</code>列表。 < code>ResourceModel是一个接口,每个< c

  • 我正在尝试使用Jakson反序列化一个嵌套的多态类型。也就是说,我的顶级类型引用了另一个多态类型,该类型最终由不抽象的类扩展。这不起作用,它会抛出一个异常。 下面是我尝试做的一个简化的例子。 我得到了关于抽象类型的标准异常。 让我解释一下我的用例。我有一个描述数据工作流的Json文档。我在“Level One”有一个抽象类型,描述对单个值的操作。我派生了一堆不是抽象的类,它们实现了公共操作(我用@