如何对不同的子对象使用不同的对象映射器属性

时间:2019-05-06 07:32:56

标签: java serialization jackson objectmapper jackson-databind

请考虑以下情况。我想序列化ClassA对象s.t。我为bObjectcObject

使用了不同的对象映射器属性。
    class ClassA {
        ClassB bObject = new ClassB();
        ClassC cObject = new ClassC();
    }

    class ClassB {
        ClassD dObject  = new ClassD();
    }

    class ClassC {
        ClassD dObject = new ClassD();
    }

    class ClassD {
        int firstMember = 1;
        String second_member = "Two";
    }

    void test() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
        objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
        objectMapper.writerWithDefaultPrettyPrinter();
        System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(new ClassA()));
    }

例如我想将PropertyNamingStrategy.UPPER_CAMEL_CASE使用bObject,将PropertyNamingStrategy.SNAKE_CASE使用cObject

序列化的json应该看起来像:

{
  "bObject" : {
    "dObject" : {
      "firstMember" : 1,
      "secondMember" : "Two"
       .... similarly camel case for any nested ....
    }
  },
  "cObject" : {
    "d_object" : {
      "first_member" : 1,
      "second_member" : "Two"
       .... similarly snake case for any nested ....
    }
  }
}

我尝试将@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)分别添加到ClassBClassC中。这样可以固定dObject的名称,但不能固定其中的字段的名称。

有什么建议吗?如果可以使用混入或自定义序列化器和解串器?

我为什么需要这样做的上下文:我当前的POJO是classA,它使用classB并在我们的服务边界使用,并且正在使用某个配置进行序列化。现在,我们将ClassC(不属于我们)添加到POJO。 classC的序列化器/串行器需要遵循不同的约定。

0 个答案:

没有答案