Jackson 无法使用 ObjectMapper 映射 Class
Jackson unable to Map Class using ObjectMapper
我正在尝试使用 Jackson 序列化一个 class,它包含两个字符串和一个字符串到字符串的映射。这是我要序列化的 json。我想知道是否有问题,因为我正在尝试序列化空数组。
{
"filters": {
"test": [
"hi"
],
"groups": [],
"groupsOT": [],
"chains": [],
"chainsOT": [],
"locations": [],
"locationsOT": [],
"reports": [],
"reportsOT": []
},
"fromDate": "09.03.2015",
"toDate": "16.03.2015"
}
这是用于尝试序列化的 class。
public class FilterRequest{
public String getToDate() {
return toDate;
}
public void setToDate(String toDate) {
this.toDate = toDate;
}
public String getFromDate() {
return fromDate;
}
public void setFromDate(String fromDate) {
this.fromDate = fromDate;
}
public Map<String, String[]> getFilters() {
return filters;
}
public void setFilters(Map<String, String[]> filters) {
this.filters = filters;
}
private String toDate;
private String fromDate;
private Map<String,String[]> filters;
public FilterRequest(){
filters = new HashMap<String,String[]>();
}
}
失败的代码只是
ObjectMapper mapper = new ObjectMapper();
FilterRequest requestParams = mapper.readValue(requestBody, FilterRequest.class);
我收到的错误是
No suitable constructor found for type [simple type, class com.aramburu.overall.web.controller.FilterController$FilterRequest]: can not instantiate from JSON object (need to add/enable type information?)
at [Source: {"filters":{"test":["hi"],"groups":[],"groupsOT":[],"chains":[],"chainsOT":[],"locations":[],"locationsOT":[],"reports":[],"reportsOT":[]},"fromDate":"09.03.2015","toDate":"16.03.2015"}; line: 1, column: 2]
输出:
No suitable constructor found for type [simple type, class com.aramburu.overall.web.controller.FilterController$FilterRequest
意味着 FilterRequest
是一个内部-class.
使 FilterRequest
class 静态化(或者 - 更好的是 - 将其移出 FilterController
)。
否则 Jackson 无法实例化它(它需要您父 class 的外部实例才能构造内部实例)。
如果您的 class 声明为内部 class,您需要将其设为静态。例如:
public class Application {
private static final String requestBody = "{\"filters\": {\"test\": [\"hi\"],\"groups\": [],\"groupsOT\": [],\"chains\": [],\"chainsOT\": [],\"locations\": [],\"locationsOT\": [],\"reports\": [],\"reportsOT\": []},\"fromDate\": \"09.03.2015\",\"toDate\": \"16.03.2015\"}";
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
FilterRequest requestParams = mapper.readValue(requestBody, FilterRequest.class);
System.out.println(requestParams);
}
public static class FilterRequest{
public String getToDate() {
return toDate;
}
public void setToDate(String toDate) {
this.toDate = toDate;
}
public String getFromDate() {
return fromDate;
}
public void setFromDate(String fromDate) {
this.fromDate = fromDate;
}
public Map<String, String[]> getFilters() {
return filters;
}
public void setFilters(Map<String, String[]> filters) {
this.filters = filters;
}
private String toDate;
private String fromDate;
private Map<String,String[]> filters;
public FilterRequest(){
filters = new HashMap<String,String[]>();
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE);
}
}
}
此致,
我正在尝试使用 Jackson 序列化一个 class,它包含两个字符串和一个字符串到字符串的映射。这是我要序列化的 json。我想知道是否有问题,因为我正在尝试序列化空数组。
{
"filters": {
"test": [
"hi"
],
"groups": [],
"groupsOT": [],
"chains": [],
"chainsOT": [],
"locations": [],
"locationsOT": [],
"reports": [],
"reportsOT": []
},
"fromDate": "09.03.2015",
"toDate": "16.03.2015"
}
这是用于尝试序列化的 class。
public class FilterRequest{
public String getToDate() {
return toDate;
}
public void setToDate(String toDate) {
this.toDate = toDate;
}
public String getFromDate() {
return fromDate;
}
public void setFromDate(String fromDate) {
this.fromDate = fromDate;
}
public Map<String, String[]> getFilters() {
return filters;
}
public void setFilters(Map<String, String[]> filters) {
this.filters = filters;
}
private String toDate;
private String fromDate;
private Map<String,String[]> filters;
public FilterRequest(){
filters = new HashMap<String,String[]>();
}
}
失败的代码只是
ObjectMapper mapper = new ObjectMapper();
FilterRequest requestParams = mapper.readValue(requestBody, FilterRequest.class);
我收到的错误是
No suitable constructor found for type [simple type, class com.aramburu.overall.web.controller.FilterController$FilterRequest]: can not instantiate from JSON object (need to add/enable type information?)
at [Source: {"filters":{"test":["hi"],"groups":[],"groupsOT":[],"chains":[],"chainsOT":[],"locations":[],"locationsOT":[],"reports":[],"reportsOT":[]},"fromDate":"09.03.2015","toDate":"16.03.2015"}; line: 1, column: 2]
输出:
No suitable constructor found for type [simple type, class com.aramburu.overall.web.controller.FilterController$FilterRequest
意味着 FilterRequest
是一个内部-class.
使 FilterRequest
class 静态化(或者 - 更好的是 - 将其移出 FilterController
)。
否则 Jackson 无法实例化它(它需要您父 class 的外部实例才能构造内部实例)。
如果您的 class 声明为内部 class,您需要将其设为静态。例如:
public class Application {
private static final String requestBody = "{\"filters\": {\"test\": [\"hi\"],\"groups\": [],\"groupsOT\": [],\"chains\": [],\"chainsOT\": [],\"locations\": [],\"locationsOT\": [],\"reports\": [],\"reportsOT\": []},\"fromDate\": \"09.03.2015\",\"toDate\": \"16.03.2015\"}";
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
FilterRequest requestParams = mapper.readValue(requestBody, FilterRequest.class);
System.out.println(requestParams);
}
public static class FilterRequest{
public String getToDate() {
return toDate;
}
public void setToDate(String toDate) {
this.toDate = toDate;
}
public String getFromDate() {
return fromDate;
}
public void setFromDate(String fromDate) {
this.fromDate = fromDate;
}
public Map<String, String[]> getFilters() {
return filters;
}
public void setFilters(Map<String, String[]> filters) {
this.filters = filters;
}
private String toDate;
private String fromDate;
private Map<String,String[]> filters;
public FilterRequest(){
filters = new HashMap<String,String[]>();
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE);
}
}
}
此致,