无法在spring boot中解析json

ltskdhd1  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(932)

这个问题在这里已经有答案了

无法反序列化spring webservice中start\数组令牌之外的对象示例(2个答案)
spring mvc:无法反序列化超出起始\u数组令牌的示例(1个答案)
19天前关门了。
我正在尝试将json中得到的响应存储在springboot的数据库中。但当它出现的时候 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

my 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]
//

如果有人能给我一些建议,我想不出是什么原因导致了这个错误

2vuwiymt

2vuwiymt1#

您只需尝试将列表反序列化为对象。
您可以按如下方式浏览ParameteredTypeReference:

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

另一方面,我认为实体本身的外部化是一种反模式,试着看看dto设计模式。
希望对你有帮助
dto是一个数据传输对象,它是一个中间对象,只接受实体的数据,并在数据库专用对象和要外部化的对象之间保持分离。
对于第一种情况:试着做一个简单的练习,为您所使用的实体添加一个与另一个实体的双向onetomany关系并创建一个控制器,您将有一个递归异常,即实体之间的调用。
第二种情况:您必须向两个应用程序发送employee对象,一个只请求名称,另一个只请求名字,在这种情况下,您将有一个或多个带有mapper的输出dto(例如mapstruct或dozer),以便向请求的应用程序输出。

q0qdq0h2

q0qdq0h22#

这个异常是由jacksonMap程序抛出的,因为它需要一个对象{},但是您发送了一个数组[]。通过在端点定义中用employees[]替换employees,可以很容易地解决这个问题。请参阅此处的更多信息:get list of json objects with spring resttemplatecannot deserialize instance of object out of start\ array token in spring 3 rest webservice

t40tm48m

t40tm48m3#

您的列表包含两个员工,并尝试将他们Map到一个。最好是将它们 Package 在一个包含列表的类中。比如:

public class EmployeeList {

List<Employee> employees=new ArrayList<>();
//getters setters
}

然后使用

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

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

相关问题