簡體   English   中英

使用JsonB反序列化自動將空字符串轉換為Java中的null

[英]Automaticaly convert empty strings to null in Java using JsonB deserialization

有沒有人試圖找到一個好的解決方案來自動將所有空字符串轉換為 null object 使用 JsonB(Yasson)進行反序列化?

我在從 Jackson 遷移到 Jsonb 時遇到了這個問題,其中請求中的空字符串值會產生反序列化異常,因為它無法解析為 object。

HTTP 請求有效載荷:

{
   fieldNameUid: '', // Java property is UUID type
}

Jackson 具有以下配置:

public void customize(ObjectMapper mapper) {
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        mapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL);

        SimpleModule module = new SimpleModule();
        module.addDeserializer(
                String.class,
                new StdDeserializer<>(String.class) {

                    @Override
                    public String deserialize(JsonParser parser, DeserializationContext context)
                            throws IOException {
                        String result = StringDeserializer.instance.deserialize(parser, context);
                        if (result == null || result.isBlank()) {
                            return null;
                        }
                        return result;
                    }
                });
        module.addDeserializer(byte[].class,
                new StdDeserializer<>(byte[].class) {

                    @Override
                    public byte[] deserialize(JsonParser parser, DeserializationContext context)
                            throws IOException {
                        String result = StringDeserializer.instance.deserialize(parser, context);
                        if (result == null || result.isBlank()) {
                            return null;
                        }
                        return result.getBytes(StandardCharsets.UTF_8);
                    }
                });

        mapper.registerModule(module);
    }

和當前的 Jsonb 配置:

public class JsonbObjectMapper implements JsonbConfigCustomizer {

    @Override
    public void customize(JsonbConfig jsonbConfig) {

        jsonbConfig
                .withDeserializers(new StringDeserializer(), new ByteArrayDeserializer(), new EnumDeserializer())
                .withSerializers(new EnumSerializer());

    }

    public static class StringDeserializer implements JsonbDeserializer<String> {

        @Override
        public String deserialize(javax.json.stream.JsonParser jsonParser, javax.json.bind.serializer.DeserializationContext deserializationContext, Type type) {
            final String str = jsonParser.getString();
            return str == null || str.isBlank() ? null : str;
        }
    }

    public static class ByteArrayDeserializer implements JsonbDeserializer<byte[]> {

        @Override
        public byte[] deserialize(javax.json.stream.JsonParser jsonParser, javax.json.bind.serializer.DeserializationContext deserializationContext, Type type) {
            final String str = jsonParser.getString();
            return str == null || str.isBlank() ? null : str.getBytes(StandardCharsets.UTF_8);
        }
    }

    public static class EnumDeserializer implements JsonbDeserializer<Enum> {

        @Override
        public Enum deserialize(javax.json.stream.JsonParser jsonParser, javax.json.bind.serializer.DeserializationContext deserializationContext, Type type) {

            final String str = jsonParser.getString();
            if (str == null || str.isBlank()) {
                return null;
            }
            for (final Enum en : ((Class<Enum>) type).getEnumConstants()) {
                if (en.toString().equals(str)) {
                    return en;
                }
            }

            return null;
        }
    }

    public static class EnumSerializer implements JsonbSerializer<Enum> {

        @Override
        public void serialize(Enum anEnum, JsonGenerator jsonGenerator, SerializationContext serializationContext) {
            jsonGenerator.write(anEnum == null ? null : anEnum.toString());
        }
    }
}

由於 JsonB 沒有替代屬性,我最終為 UUID 類型編寫了自定義反序列化器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM