从杰克逊的一个对象到另一个对象的属性的深层复制?

悉达多特里哈

我正在执行 UPDATE 操作,以便non-null将传入 POJO 中设置的所有属性复制到另一个对象(相同类型)中,这也适用于嵌套属性。

前任:

POJO:

    public class Person {

        private String homePhoneNumber;
        private String officePhoneNumber;

        private Address address;

        public String getHomePhoneNumber() {
            return homePhoneNumber;
        }

        // getter/setters


    }

    public class Address {

        private String street;
        private String houseNumber;

        public String getStreet() {
            return street;
        }
        // getter/setters
    }

    //  Source

        Person sourcePerson = new Person();
        sourcePerson.setHomePhone("123");

        Address address1 = new Address();
        address1.setStreet("Street");

        sourcePerson.setAddress(address1);

    //Dest person

        Person destPerson = new Person();
        destPerson.setOfficePhone("456");
        destPerson.setHomePhone("123");

        Address address2 = new Address();
        address2.setStreet("Street2");
        address2.setHouseNumber("246");

        destPerson.setAddress(address2);

        ObjectMapper mapper = new ObjectMapper();
       //skip setters for null values
mapper.setDefaultSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SKIP));

        Person result = mapper.updateValue(destPerson, sourcePerson);

所以我想复制所有non-null的设置属性sourcePerson中被复制destPerson,即覆盖只有那些属性destperson,其sourcePerson已成立,保持其他属性不变。

使用Person result = mapper.updateValue(destPerson, sourcePerson);不适用于嵌套属性。它正在替换Address从源到目标的整个对象

我搜索了 jackson 以找到 jackson 中的merge功能:

mapper.setDefaultMergeable(true);

但是,添加此配置也会使 中的nullsourcePerson无效destPerson,这似乎很奇怪。

mapper.configOverride(Address.class).setMergeable(true);

以上配置适用于我想要的。但是我有很多 POJO 嵌套资源,所以我不想要每个 POJO 的特定配置。

这可以以jackson干净的方式实现吗?

巴托斯·皮奥伦斯基

您可以首先启用关于合并的错误报告

com.fasterxml.jackson.databind.MapperFeature#IGNORE_MERGE_FOR_UNMERGEABLE

这必须是假的。

这种mapper.configOverride()作品确实很奇怪,但不是mapper.setDefaultMergeable()

我在你的例子中没有看到二传手。你不是@JsonSetterPerson课堂上使用注释的任何机会吗?然后他们将覆盖映射器配置。

jackson-databind单元测试中,我看到他们正在使用mapper.readerForUpdating()而不是mapper.updateValue()

 private final ObjectMapper MAPPER = objectMapperBuilder()
            // 26-Oct-2016, tatu: Make sure we'll report merge problems by default
            .disable(MapperFeature.IGNORE_MERGE_FOR_UNMERGEABLE)
            .build();

    public void testBeanMergingWithNullDefault() throws Exception
    {
        // By default `null` should simply overwrite value
        ConfigDefault config = MAPPER.readerForUpdating(new ConfigDefault(5, 7))
                .readValue(aposToQuotes("{'loc':null}"));
        assertNotNull(config);
        assertNull(config.loc);

        // but it should be possible to override setting to, say, skip

        // First: via specific type override
        // important! We'll specify for value type to be merged
        ObjectMapper mapper = newObjectMapper();
        mapper.configOverride(AB.class)
            .setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SKIP));
        config = mapper.readerForUpdating(new ConfigDefault(137, -3))
                .readValue(aposToQuotes("{'loc':null}"));
        assertNotNull(config.loc);
        assertEquals(137, config.loc.a);
        assertEquals(-3, config.loc.b);

        // Second: by global defaults
        mapper = newObjectMapper();
        mapper.setDefaultSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SKIP));
        config = mapper.readerForUpdating(new ConfigDefault(12, 34))
                .readValue(aposToQuotes("{'loc':null}"));
        assertNotNull(config.loc);
        assertEquals(12, config.loc.a);
        assertEquals(34, config.loc.b);
    }

也值得尝试com.fasterxml.jackson.annotation.JsonMerge直接在Person课堂上使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我想使用杰克逊库将嵌套在另一个对象中的json对象映射到POJO

如何声明另一个杰克逊ObjectMapper不影响原豆的“客户”?

如何将几个参数移动到杰克逊的另一个节点?

将对象属性复制到Groovy中的另一个对象

使用Angular将对象属性(不带值)复制到另一个对象

如何将一个Python对象的所有属性复制到另一个对象?

将一个对象的选定属性值复制到另一个对象

如何在Python中将一个对象的所有属性复制到另一个对象?

mongodb:将数组属性从一个对象复制到另一个对象

映射一个JSON字符串与杰克逊对象将抛出MismatchedInputException

如何序列化一个列表的内容与杰克逊平坦JSON对象?

JS 将一个对象复制到另一个对象

将条件从一个对象复制到另一个对象

将对象的属性复制到另一个跳过未定义的属性

仅将一个对象的值复制到另一个非属性的javascript

angularjs-将通用属性从一个对象复制到另一个

如何将属性从一个.net对象复制到另一个

将对象列表复制到另一个对象中另一个对象的另一个列表

Angular-2:将一个对象复制到另一个

将对象从一个 json 数组复制到另一个

基于另一个字段映射JSON字段(为一个值),使用杰克逊(这是一个键)

将对象从一个对象数组复制到React中的另一个对象

重新排序对象-将对象复制(剪切)到另一个对象

杰克逊(Jackson):杰森(Json)具有到Java类的json数组,该数组具有另一个Java类的列表

JAVA-如何将一个对象的属性复制到另一个具有相同属性的对象?

杰克逊反电子化:根源上的两个关键。我如何解开一个而忽略另一个?

为了将非null属性从对象复制到另一个对象的助手?(Java)

将可枚举自己的属性从对象数组复制到另一个类对象数组的最佳方法

复制一个对象,该对象包含另一个对象的超类