这个问题在这里已经有答案了:
无法反序列化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]
//
如果有人能给我一些建议,我想不出是什么原因导致了这个错误
3条答案
按热度按时间2vuwiymt1#
您只需尝试将列表反序列化为对象。
您可以按如下方式浏览ParameteredTypeReference:
另一方面,我认为实体本身的外部化是一种反模式,试着看看dto设计模式。
希望对你有帮助
dto是一个数据传输对象,它是一个中间对象,只接受实体的数据,并在数据库专用对象和要外部化的对象之间保持分离。
对于第一种情况:试着做一个简单的练习,为您所使用的实体添加一个与另一个实体的双向onetomany关系并创建一个控制器,您将有一个递归异常,即实体之间的调用。
第二种情况:您必须向两个应用程序发送employee对象,一个只请求名称,另一个只请求名字,在这种情况下,您将有一个或多个带有mapper的输出dto(例如mapstruct或dozer),以便向请求的应用程序输出。
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
t40tm48m3#
您的列表包含两个员工,并尝试将他们Map到一个。最好是将它们 Package 在一个包含列表的类中。比如:
然后使用
您还可以考虑实体和前端之间的另一层对象。序列化/反序列化实体将导致问题,特别是当它们包含彼此之间的关系时。