【问题标题】:Unable to parse JSON in spring boot [duplicate]无法在 Spring Boot 中解析 JSON [重复]
【发布时间】:2021-03-31 06:52:38
【问题描述】:

我正在尝试在 Spring Boot 中将我在 JSON 中获得的响应存储在我的数据库中。但是当它显示JSON Parse Error

这是我的 JSON 响应

[
{
id: 1,
name: "Bilbo Baggins",
location: "india",
email: "jba2hba.com",
dateOfBirth: "2020-12-21T13:13:38.000+00:00"
},
{
id: 2,
name: "Frodo Baggins",
location: "bhutan",
email: "jhb@hbh.com",
dateOfBirth: "2020-12-21T13:13:38.000+00:00"
}
]

我的员工模型

    @Entity
    public class Employee {
        
        private @Id @GeneratedValue( strategy = GenerationType.AUTO ) Long id;
        private String name;
        private String location;
        private String email;
        private Date dateOfBirth;
    
        public Employee() {
        }
    
        public Employee(String name, String location, String email, Date date) {
    
            this.name = name;
            this.location = location;
            this.email = email;
            this.dateOfBirth = date;
        }
//getters and setters

我的 getEmployees() 方法

public void getEmployees() {
        
        RestTemplate restTemplate = new RestTemplate();
        Employee result = restTemplate.getForObject(Constants.URI, Employee.class);
        System.out.println(result);
        }

这是我遇到的错误

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.nagarro.hrLogin.entity.Employee` out of START_ARRAY token
 at [Source: (PushbackInputStream); line: 1, column: 1]
    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) ~[jackson-databind-2.11.3.jar:2.11.3]
    at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1468) ~[jackson-databind-2.11.3.jar:2.11.3]
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1242) ~[jackson-databind-2.11.3.jar:2.11.3]
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1190) ~[jackson-databind-2.11.3.jar:2.11.3]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeFromArray(BeanDeserializer.java:604) ~[jackson-databind-2.11.3.jar:2.11.3]
//

如果有人可以建议我这样做会很有帮助,我无法弄清楚可能导致错误的原因

【问题讨论】:

  • 似乎响应是员工列表/数组,而不是单个。
  • 有没有办法循环遍历列表来获取单个员工?

标签: java spring rest


【解决方案1】:

您只需尝试将列表反序列化为对象。

你可以通过 ParameterizedTypeReference 如下:

ResponseEntity<List<Employee>> response = this.restTemplate.exchange("URL", HttpMethod.GET,null,new ParameterizedTypeReference<List<Employee>>(){});

另一方面,我认为将实体本身外部化是一种反模式,请尝试查看 DTO 设计模式。

希望对你有帮助

DTO 是数据传输对象,它是一个中间对象,它只获取实体的数据,并在专用于数据库的对象和要外部化的对象之间保持分离。

对于第一种情况:尝试做一个简单的练习,为您的实体添加与另一个实体的双向 OneToMany 关系并创建一个控制器,您将在实体之间的调用中遇到递归异常。

第二种情况:您必须向 2 个应用程序发送一个员工对象,一个只请求名称,另一个只请求名字,在这种情况下,您将有一个或多个带有映射器的输出 DTO(例如 mapstruct 或 dozer ) 用于向请求的应用程序输出。

【讨论】:

    【解决方案2】:

    您的列表包含两名员工,您尝试将他们映射到一名。最好的办法是将它们包装在一个包含列表的类中。比如:

    public class EmployeeList {
    
    List<Employee> employees=new ArrayList<>();
    //getters setters
    }
    

    然后使用

    Employee result = restTemplate.getForObject(Constants.URI, EmployeeList.class);
    

    您也可以考虑实体和前端之间的另一层对象。序列化/反序列化实体会导致问题,尤其是当它们包含彼此之间的关系时。

    【讨论】:

    • 您好,感谢您的帮助,您能解释一下“实体和前端之间的另一层对象”是什么意思吗?
    【解决方案3】:

    Jackson 映射器抛出此异常,因为它需要一个 Object {},但您发送了一个数组 []。您可以通过在端点定义中将 Employee 替换为 Employees[] 来轻松解决此问题。 在这里查看更多: Get list of JSON objects with Spring RestTemplate Cannot deserialize instance of object out of START_ARRAY token in Spring 3 REST Webservice

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 1970-01-01
      • 2017-09-20
      • 2020-10-22
      • 2018-02-10
      • 2018-06-29
      • 2015-06-28
      • 2019-12-14
      • 1970-01-01
      相关资源
      最近更新 更多