【问题标题】:Deserializing a list results in duplicates反序列化列表会导致重复
【发布时间】:2015-05-22 00:52:15
【问题描述】:

我有一个简单的 pojo,其中我有一个字符串列表和默认 get/set,我还有另一个 get,因此在 json 中我得到 2 个不同的字段 我的 pojo 和测试代码 sn-p 在下面

  public static class TestClass{
    public ArrayList<String> names = null;

    public ArrayList<String> getNames() {
        if(null == names) names = new ArrayList<>();
        return names;
    }

    public void setNames(ArrayList<String> names) {
        this.names = names;
    }

    public ArrayList<String> getNames_r() {
        return getNames();
    }

    @Override
    public String toString() {
        return "TestClass [names=" + names + "]";
    }

}

@Test
public void testDeSerializationSimple() throws JsonParseException, JsonMappingException, IOException{
    String justSchool = "{\"names\":[\"second\",\"one\",\"two\",\"three\"],\"names_r\":[\"second\",\"one\",\"two\",\"three\"]}";

    ObjectMapper myDefaultMapper= new ObjectMapper();
    myDefaultMapper.setDateFormat(CoreUtils.COMMON_SIMPLE_DATE_FORMAT)
    .setTimeZone(TimeZone.getTimeZone("UTC"))
    .enable(SerializationFeature.INDENT_OUTPUT)
    .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    TestClass testReadDummy = myDefaultMapper.readValue(justSchool, TestClass.class);
    System.out.println(" mapper test read = "+testReadDummy);
    //assertEquals(testRead.getListString().size(),4);
    System.out.println("list = "+testReadDummy);
    assertEquals(testReadDummy.names.size(), 4);
}

【问题讨论】:

    标签: jackson deserialization


    【解决方案1】:

    尝试在列表的副本中使用 @JsonIgnore 注释,这样它就不会被序列化,它看起来像:

    @JsonIgnore    
    public ArrayList<String> getNames_r() {
        return getNames();
    }
    

    这应该可以消除序列化 JSON 中的重复字段。

    希望对你有帮助,

    何塞·路易斯

    【讨论】:

    • 我想对字段进行序列化,但在反序列化时我不想阅读它。
    • github.com/FasterXML/jackson-databind/issues/95 这是相似的,但由于我使用的是旧版本,我试图找出任何方法来获得预期的输出
    • 你是哪个版本的?我知道从 Jackson 1.9 版本开始,您可以使用 @JsonIgnore@JsonProperty 注释来控制属性的序列化和反序列化,就像我已经在这里一样:stackoverflow.com/questions/30134298/…。希望对您有所帮助!
    • 问题是我在序列化和反序列化时想要它,它调用 getter 并将其添加到列表中。因为我没有二传手,如果添加二传手然后我的问题就解决了,但想知道我是否可以在不添加二传手的情况下解决它
    【解决方案2】:

    将映射器配置为不使用 getter 作为 setter MAPPER.configure(MapperFeature.USE_GETTERS_AS_SETTERS, false);

    解决了这个问题

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      相关资源
      最近更新 更多