【问题标题】:Deserialize a JSON with a nested object and a list. "JSON parse error: Cannot construct"使用嵌套对象和列表反序列化 JSON。 “JSON 解析错误:无法构造”
【发布时间】:2019-08-26 19:32:06
【问题描述】:

我需要反序列化这个 JSON:

{  
"order":{  
    "address": "Adress XXX",
    "status": "Open",
    "confirmationDates": "2019-04-03"
},

"orderItems": [
        {
            "description": "Item 1",
            "unitPrice": 10.5,
            "quantity": 2
        },
        {
            "description": "Item 2",
            "unitPrice": 22.5,
            "quantity": 2
        },
        {
            "description": "Item 3",
            "unitPrice": 10000.5,
            "quantity": 2
        }
    ] 
}

我正在使用 Spring Boot,并且对此正文有一个 Post 请求。

@PostMapping("/orderwithitems")
public ResponseEntity<Object> addOrderWithItems(@RequestBody OrderOrderItem orderOrderItem){...}

包装类就是这个 POJO:

public class OrderOrderItem{
    private Order order;
    private List<OrderItem> orderItems;
    public OrderOrderItem(){
        orderItems = new ArrayList<>();
        order = new Order();
    }

    public OrderOrderItem(Order order, List<OrderItem> orderItems) {
        this.order = order;
        this.orderItems = orderItems;
    }
...
}

问题是当我发帖时出现这个错误:

{
    "timestamp": "2019-04-04T23:04:19.640+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "JSON parse error: Cannot construct instance of `com.invillia.acme.OrderController$OrderOrderItem` (although at least one Creator exists): can only instantiate non-static inner class by using default, no-argument constructor; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.invillia.acme.OrderController$OrderOrderItem` (although at least one Creator exists): can only instantiate non-static inner class by using default, no-argument constructor\n at [Source: (PushbackInputStream); line: 2, column: 2]",
    "path": "/orderwithitems"
}

我正在尝试遵循这些示例: https://www.baeldung.com/jackson-collection-array

https://www.baeldung.com/spring-rest-template-list

但我找不到解决方案。

【问题讨论】:

  • OrderOrderItem 没有 arg 构造函数或参数化? Order 和 OrderItem 构造函数呢?
  • @javapedia.net 我在 Order 和 OrderItem 上添加了带参数和不带参数的构造函数。还将构造函数添加到 OrderOderItem。还是一样的错误。
  • 你能把所有的构造函数都扔掉,然后重试吗?
  • @javapedia.net 我删除了构造函数,但它仍然不起作用。 “acme.OrderController$OrderOrderItem`(尽管至少存在一个Creator):只能使用默认的、无参数的构造函数来实例化非静态内部类;嵌套异常是com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造com.invillia.acme.OrderController$OrderOrderItem 的实例(尽管至少存在一个 Creator):只能在 [Source: (PushbackInputStream); line: 2, column: 2]",

标签: java json spring-boot spring-mvc


【解决方案1】:

问题是我将“OrderOrderItem”声明为控制器的内部类。 将 OrderOrderItem 移动到一个新文件可以使事情正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2017-07-27
    • 2019-03-08
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多