我试图反序列化以下JSON:
{
"name": "TEST",
"data": [["Toto", true, 42], ["ABC", "DEF", false]]
}
"数据" value是JSON元素列表的列表(字符串,整数或布尔值)。
我使用带有公共属性的简单POJO使其工作:
public class MyDecoder {
public String name;
public List<List<Object>> data;
}
但是现在,我希望我的属性是私有的,所以我使用了构造函数:
public class MyDecoder {
private String name;
private List<List<Object>> data;
public MyDecoder() {
}
@JsonCreator
public MyDecoder(
@JsonProperty("name") String name,
@JsonProperty("data") List<List<Object>> data)
{
this.name = name;
this.data = data;
}
}
但这失败了:
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: 无法识别的字段&#34;数据&#34; (类XXX.MyDecoder),未标记为 忽略
我错过了什么?
我想它与List<List<Object>> data
有关,因为杰克逊对String name
没有任何问题。
但是,我不明白为什么它在具有公共属性的版本中起作用。
我使用的是杰克逊2.7.5。
谢谢!
答案 0 :(得分:0)
对于警告,如果有一个JSON属性没有任何设置方法(通过可见的setter或字段,或带有@JsonProperty注释参数的@JsonCreator带注释的构造函数),将抛出异常 - 除非配置已更改为忽略此类“未知”属性。
你有没有尝试过这种方式
public class MyDecoder {
@JsonProperty("name")
private String name;
@JsonProperty("data")
private List<List<Object>> data;
public MyDecoder() {
}
@JsonCreator
public MyDecoder(
String name,
List<List<Object>> data)
{
this.name = name;
this.data = data;
}
}
答案 1 :(得分:0)
尝试添加getter和setter:
public class MyDecoder {
public String name;
public List<List<Object>> data;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<List<Object>> getData() {
return data;
}
public void setData(List<List<Object>> data) {
this.data = data;
}
}
测试一下:
public class Test {
public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
MyDecoder myDecoder = objectMapper.readValue("{\n" +
" \"name\": \"TEST\",\n" +
" \"data\": [[\"Toto\", true, 42], [\"ABC\", \"DEF\", false]]\n" +
"}", MyDecoder.class);
System.out.println(myDecoder.toString());
}
}