Jackson JSON 无法反序列化哈希集
Jackson JSON unable to deserialize hashset
我一直在寻找以下异常消息的解决方案,当我 POST 对实体进行更新时,我在 spring-boot/spring-mvc 项目中收到:
o.s.w.s.m.m.a.HttpEntityMethodProcessor : Written [{timestamp=Wed Jan 14 11:15:34 MST 2015, status=400, error=Bad Request, exception=org.springframework.http.converter.HttpMessageNotReadableException, message=Could not read JSON: Can not deserialize instance of java.util.HashSet out of START_OBJECT token
at [Source: org.apache.catalina.connector.CoyoteInputStream@7f5840c4; line: 1, column: 146] (through reference chain: com.company.product.model.people.dto.EmployeeDTO["user"]->com.company.product.security.dto.UserDTO["roles"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.HashSet out of START_OBJECT token
但是,我的情况似乎与我在 Whosebug 和 Jackson 文档中看到的其他情况略有不同。
这是我的两个数据结构:
public class EmployeeDTO {
List<WorkdayDTO> workDays = new ArrayList<WorkdayDTO>();
private UserDTO user;
...
public List<WorkdayDTO> getWorkDays() {
return workDays;
}
public void setWorkDays(List<WorkdayDTO> workDays) {
this.workDays = workDays;
}
public UserDTO getUser() {
return user;
}
public void setUser(UserDTO user) {
this.user = user;
}
}
并且:
public class UserDTO {
private boolean credentialsNonExpired;
private OfficeDTO office;
@JsonProperty("roles") // <-- added this based on early research, hasn't helped though
private Set<String> roles = new HashSet<String>();
// .. standard getters & setters
}
当我执行 GET 时,我的 json 响应是这样的:
[
{
"employeeId":1,
"endDateTime":null,
"workDays":[
],
"ssn":"111-22-3333",
"maskedSsn":null,
"user":{
"username":"user@test.com",
"password":null,
"enabled":true,
"accountNonExpired":true,
"accountNonLocked":true,
"credentialsNonExpired":true,
"office":null,
"roles":[
"OWNER"
]
},
"address":{
...
}
},
{
"employeeId":2,
"endDateTime":null,
"workDays":[
...
],
"ssn":"333-44-5555",
"maskedSsn":null,
"user":{
"username":"userA@test.com",
"password":null,
"enabled":true,
"accountNonExpired":true,
"accountNonLocked":true,
"credentialsNonExpired":true,
"office":null,
"roles":[
"MANAGER"
]
},
"address":{
...
}
}
]
它似乎不喜欢我的 employee.user.roles 列表中的单个字符串,但添加“@JsonProperty("roles")”也无济于事。
POST 的正文格式不正确。它包含 roles
的 JSON 对象。 JSON 对象无法映射到 HashSet
,因此失败。 roles
在你的 JSON 需要是一个数组。
我一直在寻找以下异常消息的解决方案,当我 POST 对实体进行更新时,我在 spring-boot/spring-mvc 项目中收到:
o.s.w.s.m.m.a.HttpEntityMethodProcessor : Written [{timestamp=Wed Jan 14 11:15:34 MST 2015, status=400, error=Bad Request, exception=org.springframework.http.converter.HttpMessageNotReadableException, message=Could not read JSON: Can not deserialize instance of java.util.HashSet out of START_OBJECT token
at [Source: org.apache.catalina.connector.CoyoteInputStream@7f5840c4; line: 1, column: 146] (through reference chain: com.company.product.model.people.dto.EmployeeDTO["user"]->com.company.product.security.dto.UserDTO["roles"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.HashSet out of START_OBJECT token
但是,我的情况似乎与我在 Whosebug 和 Jackson 文档中看到的其他情况略有不同。
这是我的两个数据结构:
public class EmployeeDTO {
List<WorkdayDTO> workDays = new ArrayList<WorkdayDTO>();
private UserDTO user;
...
public List<WorkdayDTO> getWorkDays() {
return workDays;
}
public void setWorkDays(List<WorkdayDTO> workDays) {
this.workDays = workDays;
}
public UserDTO getUser() {
return user;
}
public void setUser(UserDTO user) {
this.user = user;
}
}
并且:
public class UserDTO {
private boolean credentialsNonExpired;
private OfficeDTO office;
@JsonProperty("roles") // <-- added this based on early research, hasn't helped though
private Set<String> roles = new HashSet<String>();
// .. standard getters & setters
}
当我执行 GET 时,我的 json 响应是这样的:
[
{
"employeeId":1,
"endDateTime":null,
"workDays":[
],
"ssn":"111-22-3333",
"maskedSsn":null,
"user":{
"username":"user@test.com",
"password":null,
"enabled":true,
"accountNonExpired":true,
"accountNonLocked":true,
"credentialsNonExpired":true,
"office":null,
"roles":[
"OWNER"
]
},
"address":{
...
}
},
{
"employeeId":2,
"endDateTime":null,
"workDays":[
...
],
"ssn":"333-44-5555",
"maskedSsn":null,
"user":{
"username":"userA@test.com",
"password":null,
"enabled":true,
"accountNonExpired":true,
"accountNonLocked":true,
"credentialsNonExpired":true,
"office":null,
"roles":[
"MANAGER"
]
},
"address":{
...
}
}
]
它似乎不喜欢我的 employee.user.roles 列表中的单个字符串,但添加“@JsonProperty("roles")”也无济于事。
POST 的正文格式不正确。它包含 roles
的 JSON 对象。 JSON 对象无法映射到 HashSet
,因此失败。 roles
在你的 JSON 需要是一个数组。