我正在创建一个具有嵌套列表的API。Jackson似乎是一个创建对象的好工具,但我不太清楚如何嵌套列表,我想知道这是否可能。
我的对象看起来像这样。
public class Order {
public String name;
public List<Item> items;
}
我希望有一种方法可以将其映射到json,看起来像:
{
name : "A name"
items : {
elements : [{
price : 30
}]
}
}
我们希望能够做到这一点,以便我们可以将属性添加到列表中。
您的JSON转换为:“名为items的对象属于一种类型,它具有名为elements的属性,这是某种类型的列表”。
因此,Item类只需要一个属性:
class Item {
List<Something> getElements();
}
请注意,您的Java代码不会映射到您的JSON。您的Java类将映射到以下内容:
{
"name" : "foo",
"items" : [
{ /* encoded version of Item */ }
]
}
通常,最好将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() { ... }
}
强制List
或Collection
像POJO一样序列化,而不是正常的特殊处理。可能会有一些副作用,因为自省用于查找可能的访问器,但一般方法应该有效
您可以为列表编写自定义反序列化器
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”有一个抽象类型,描述对单个值的操作。我派生了一堆不是抽象的类,它们实现了公共操作(我用@