java—对其他类中的属性使用jsonignore

3bygqnnd  于 2021-07-03  发布在  Java
关注(0)|答案(5)|浏览(453)

我在使用的库中遇到一个类的问题。
当我想反序列化它时,就会出现这个问题。
实际上,这个类有一个名为“getcopy”的方法,它返回自己的一个新示例,该示例包含相同的方法,并且仍然调用它 StackOverFlowException 在以下循环中:
在com.fasterxml.jackson.databind.ser.beanserializer.serialize(beanserializer。java:166)
在com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter。java:728)
在com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase。java:723)

public class Object {
   ...
   ObjectAttribute objectAttribute;
   ...

   public ObjectAttribute getObjectAttribute(){
      return this.objectAttribute
   }
   ...
}

public class ObjectAttribute{
   ...

   public ObjectAttribute getCopy{
      return copy(this) //return a new instance of himself
   }
   ...
}

有没有办法忽略这个方法 getCopy() 就像 @JsonIgnoreAttribute("objectProperty.copy") ?

0mkxixxg

0mkxixxg1#

您可以重写jsonserializer并为类执行特定的逻辑

public class CustomSerializerForC extends JsonSerializer<C> {
   @Override
   public Class<C> handledType() {
       return C.class;
   }
  @Override
   public void serialize(C c, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
       String upperCase = c.getValue().toUpperCase();
       jsonGenerator.writeString(upperCase);
   }
}

使用 Serializer 用于 ObjectMapper :

SimpleModule module = new SimpleModule("MyCustomModule", new Version(1, 0, 0, null));
   module.addSerializer(new CustomSerializerForC());
   ObjectMapper mapper = new ObjectMapper();
   mapper.registerModule(module);
93ze6v8z

93ze6v8z2#

您可以注册序列化程序并选择所需的字段

/**
 * We can not change source code so we are adding serializer for a specific type.
 *
 */
public static class JsonSpecificTypeSerializer extends JsonSerializer<SpecificType> {

    @Override
    public void serialize(SpecificType t, JsonGenerator jsonGen, SerializerProvider serializerProvider) throws IOException {
        jsonGen.writeStartObject();
        jsonGen.writeFieldName("field1");
        jsonGen.writeNumber(t.getield1());
        .......

        jsonGen.writeEndObject();
    }

}

/**
 * Customize jackson.
 *
 * adding configuration to jackson without overriding spring boot default conf.
 */
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizeJackson() {
    return jacksonObjectMapperBuilder -> {
        jacksonObjectMapperBuilder.serializerByType(SpecificType.class,
                new JsonSpecificTypeSerializer());
    };
}
up9lanfz

up9lanfz3#

对于忽略方法 getCopy ,只需重命名此方法,例如 copy 每种方法都从 get 然后序列化,例如如果方法名为 getSomething 然后序列化到 something: (return value by method)) 所以如果你把方法名改为 copy 或者 copyInstance 或者每个名字都没有开头 get 则方法未序列化

gajydyqb

gajydyqb4#

有两种方法可以解决你的问题:
为特定类编写自定义反序列化程序,并在jacksonMap器中注册它。
调整全局jacksonMap器以忽略自动检测中的类getter,并仅使用字段。
请尝试以下配置的2种方式:

ObjectMapper mapper = new ObjectMapper();

mapper.setVisibility(JsonMethod.ALL, Visibility.NONE);
mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);

如果你决定单程前进,请写在这里如果你需要帮助。

zc0qhyus

zc0qhyus5#

对于这个特定的用例,当您在第三方库中有一个不能修改的类时,jackson提供了混合注解。
这个概念背后的思想是提供一个类来指示如何完成另一个类的序列化。
例如,在您的用例的类定义中考虑以下混合:

public abstract class ObjectAttributeMixIn{
   // You need to provide definitions for every property you need
   // to serialize, and the proper constructor if necessary
   ...

   // Ignore the getCopy method
   @JsonIgnore
   public abstract ObjectAttribute getCopy();

   ...
}

您可以在mix-in定义中使用完整的jackson注解集。
然后,将混合物与 ObjectAttribute 班级。您可以使用 ObjectMapper 为此,您正在使用进行序列化:

objectMapper.addMixInAnnotations(ObjectAttribute.class, ObjectAttributeMixIn.class);

你也可以注册一个自定义模块代替;请参阅相关文件。

相关问题