从 OData V2 实体获取嵌套 "results" 列表

Get nested "results" list from OData V2 entity

为了解释我的问题,假设我正在检索以下 OData V2 实体:

{
    "d": {
        "EmployeeID": 1,
        "LastName": "Davolio",
        "FirstName": "Nancy",
        "Orders": {
            "results": [
                {
                    "OrderID": 10258
                }
            ]
        },
        "Territories": {
            "results": [
                {
                    "TerritoryID": "06897"
                }
            ]
        }
    }
}

并且我有对应的型号Class:

@JsonRootName(value = "d")
public class Employee {

    @JsonProperty("EmployeeID")
    private int employeeId;
    
    @JsonProperty("LastName")
    private String lastName;
    
    @JsonProperty("FirstName")
    private String firstName;
    
    @JsonProperty("Orders")
    private List<Order> orders;
    
    @JsonProperty("Territories")
    private List<Territory> territories;

...
}

正如预期的那样,触发了异常 com.fasterxml.jackson.databind.exc.MismatchedInputException,因为“订单”和“领土”集合实际上在 属性“结果”中,正如 OData V2 所述。

你们知道如何忽略嵌套的“结果”属性 并立即获取列表吗? 在这种情况下是否真的需要自定义反序列化器或包装器 class?

谢谢!

总是有多种方法可以解决这个问题。

一种是创建包装器 class 并让 Employee 直接引用它。

例如:

public class WrapperDto<T> implements Serializable {
    @JsonProperty("results")
    private List<T> elements;
}
public class Employee {
...
    @JsonProperty("Orders")
    private WrapperDto<Order> orders;
    
    @JsonProperty("Territories")
    private WrapperDto<Territory> territories;
...
}

当你想获取订单时,你必须调用 orders.getResults() 来获取列表

另一种解决方案可以在这里找到,您可以在此处找到自定义包装器: