【问题标题】:Using a different object mapper for a part of json对 json 的一部分使用不同的对象映射器
【发布时间】:2019-04-28 15:42:49
【问题描述】:

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

现在我们正在向我们的输入添加另一个对象,该对象由一个共同的团队拥有,并拥有自己的对象映射器配置以正确序列化它。

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;
    }
}

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

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

【问题讨论】:

  • 你用的是哪个版本的jackson??
  • @chinoy 我正在使用 Jackson-2.8

标签: java json jackson objectmapper jackson-databind


【解决方案1】:

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

【讨论】:

  • 我希望为CommonlyOwnedClass 的对象及其子对象重载可见性检查器,但不适用于MyOtherOwnedClass1MyOtherOwnedClass2 等其他类/对象
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
相关资源
最近更新 更多