对 json 的一部分使用不同的对象映射器



对于我们的服务输入,我们使用具有某些配置的对象映射器来序列化它。我们在 client-lib 中向客户端提供相同的对象映射器配置,并使用相同的配置来反序列化我们端的输入。

现在,我们将另一个对象添加到我们的输入中,该对象由一个公共团队拥有,并且具有自己的对象映射器配置来正确序列化它。

class MyAPIRequest {
    MyOtherOwnedClass1 obj1;
    MyOtherOwnedClass2 obj2;
    //New Shared class which is being added as part of input now: 
    CommonlyOwnedClass newObj;
}

class MyAPIRequestObjectMapperFactory() {
   static ObjectMapper newInstance(IonSystem ionSystem) {
        final ObjectMapper  objectMapper = new ObjectMapper();                 
        objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
        objectMapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
        objectMapper.setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);
        return objectMapper;
    }
}
class CommonlyOwnedClassObjectMapperFactory() {
   static ObjectMapper newInstance(IonSystem ionSystem) {
        final ObjectMapper  objectMapper = new ObjectMapper();                 
        objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.NONE);
        objectMapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.ANY);
        objectMapper.setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.ANY);
        return objectMapper;
    }
}

如何更新我的对象映射器以对newObj使用不同的对象映射器(由CommonlyOwnedClassObjectMapperFactory提供(,并继续对MyAPIRequest中的其余对象使用现有的对象映射器(MyAPIRequestObjectMapperFactory年(?

编辑:我使用的是 Jackson-2.8,但如果需要,可以升级到 2.9

setVisibility 方法由受保护的配置变量控制(2.8 中的 _serializationConfig & _deserializationConfig 和 2.9 中的 _configOverrides(。方法setVisibility是重载的,它需要一个可见性检查器来覆盖内部配置变量。您可以使用重载版本通过从外部映射器获取可见性检查器来设置映射器的配置。

ObjectMapper yourObjectMapper = MyAPIRequestObjectMapperFactory.newInstance();
    ObjectMapper externalObjectMapper = CommonlyOwnedClassObjectMapperFactory.newInstance();
    yourObjectMapper.setVisibility(externalObjectMapper.getVisibilityChecker());
    //then set your visibility

最新更新