首页 文章

Jackson 与JSON:私人属性而不是公共

提问于
浏览
1

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

{
   "name": "TEST",
   "data": [["Toto", true, 42], ["ABC", "DEF", false]]
}

“data”值是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:无法识别的字段“data”(类XXX.MyDecoder),未标记为可忽略

我错过了什么?我猜这与 List<List<Object>> data 有关,因为 Jackson 对 String name 没有任何问题 . 但是,我不明白为什么它在具有公共属性的版本中有效 .

我正在使用 Jackson 2.7.5 .

谢谢!

2 回答

  • 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;
      }
    }
    
  • 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());
        }
    
    }
    

相关问题