gpt4 book ai didi

java - Jackson:字段类型限制

转载 作者:行者123 更新时间:2023-11-30 05:23:54 25 4
gpt4 key购买 nike

如果传递的 pojo 包含意外类型的字段,是否可以让 jackson 在写入 json 时抛出异常?我想与自定义序列化程序一起提供预期类型。

最佳答案

Jackson 将所有属性包装在 com.fasterxml.jackson.databind.ser.BeanPropertyWriter 对象中,并且它们负责序列化值。我们可以使用自定义实现来装饰这些对象:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;

import java.util.List;
import java.util.stream.Collectors;

public class JsonTypeApp {

public static void main(String[] args) throws Exception {
SimpleModule fieldRestrictionModule = new SimpleModule("FieldRestriction");
fieldRestrictionModule.setSerializerModifier(new BeanSerializerModifier() {
@Override
public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
return beanProperties.stream().map(p -> new PrimitivesOnlyBeanPropertyWriter(p)).collect(Collectors.toList());
}
});

ObjectMapper mapper = JsonMapper.builder()
.addModule(fieldRestrictionModule)
.build();

System.out.println(mapper.writeValueAsString(new Test()));
}
}

class PrimitivesOnlyBeanPropertyWriter extends BeanPropertyWriter {

public PrimitivesOnlyBeanPropertyWriter(BeanPropertyWriter writer) {
super(writer);
}

@Override
public void serializeAsField(Object bean, JsonGenerator gen, SerializerProvider prov) throws Exception {
if (getType().isPrimitive()) {
super.serializeAsField(bean, gen, prov);
} else {
throw new IllegalStateException(getType().getTypeName() + " is not allowed!");
}
}
}

如果Test类仅包含原始字段对象将被正确序列化。在其他情况下 - 将抛出java.lang.IllegalStateException

关于java - Jackson:字段类型限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59032895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com