Java Jackson with JSON:私有属性而不是公共属性

Java Jackson with JSON:私有属性而不是公共属性,java,json,jackson,Java,Json,Jackson,我正在尝试反序列化以下JSON: { "name": "TEST", "data": [["Toto", true, 42], ["ABC", "DEF", false]] } “data”值是JSON元素列表(字符串、整数或布尔值) 我使用具有公共属性的简单POJO实现了这一点: public class MyDecoder { public String name; public List<List<Object>> data; } 公共类My

我正在尝试反序列化以下JSON:

{
   "name": "TEST",
   "data": [["Toto", true, 42], ["ABC", "DEF", false]]
}
“data”值是JSON元素列表(字符串、整数或布尔值)

我使用具有公共属性的简单POJO实现了这一点:

public class MyDecoder {
  public String name;
  public List<List<Object>> data;
}
公共类MyDecoder{
公共字符串名称;
公开名单数据;
}
但是现在,我希望我的属性是私有的,所以我使用一个构造函数:

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;
  }
}
公共类MyDecoder{
私有字符串名称;
私人名单数据;
公共MyDecoder(){
}
@JsonCreator
公共MyDecoder(
@JsonProperty(“名称”)字符串名称,
@JsonProperty(“数据”)列表数据)
{
this.name=名称;
这个数据=数据;
}
}
但这是失败的:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: 无法识别的字段“数据”(类XXX.MyDecoder),未标记为 可鄙的

我错过了什么? 我想这与
列表数据
有关,因为Jackson对
字符串名
没有问题。 但是,我不明白为什么它在具有公共属性的版本中工作

我用的是杰克逊2.7.5


谢谢

至于警告,如果存在无法设置的JSON属性(通过visible setter或field,或带有@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;
  }
}
公共类MyDecoder{
@JsonProperty(“名称”)
私有字符串名称;
@JsonProperty(“数据”)
私人名单数据;
公共MyDecoder(){
}
@JsonCreator
公共MyDecoder(
字符串名,
列表数据)
{
this.name=名称;
这个数据=数据;
}
}

尝试添加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;
    }
}

大概能手和二传手。谢谢,成功了!令人惊讶的是,添加“void setData(List data)”并删除构造函数成功了,即使没有setName()!如果有人能解释为什么…但是,我仍然想让它与构造函数一起工作。添加get/set类似于将属性公开…同样的问题。。。无论如何,谢谢。对象D可能有问题
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());
    }

}