【问题标题】:Throw error if strings are not double quoted while using jackson objectmapper deserialization如果在使用 jackson objectmapper 反序列化时字符串不是双引号,则抛出错误
【发布时间】:2021-01-13 23:46:34
【问题描述】:

我有一个 JSON:

{
    "stringField" : 1234,
    "booleanField": true,
    "numberField": 1200.00
}

我使用对象映射器将 json 反序列化为:-

@Data
class SomeClass {
    String stringField;
    boolean booleanField;
    float numberField;
}

我希望 objectMapper 抛出错误,因为根据 json 规范,String 字段的值必须用双引号引起来。如何让 objectMapper 抛出错误?

【问题讨论】:

  • 这不是已经引发了一些错误,因为这只是无效的 JSON(基于缺少的引号)
  • 这不是一个无效的 json 对吧?例如,布尔值应该不带引号,数字应该不带引号..
  • 布尔值和数字(和空值)正是允许不带引号的两件事,“asdadasd”不是真、假、空或数字 -> 无效。检查jsonlint.com
  • 好吧,对不起我的错。我已经编辑了我的问题。 String 字段现在是 1234。这必须用双引号引起来,因为 POJO 的字段是 String 类型。我希望 objectMapper 会抛出一个错误。我可以强制执行吗?
  • 我认为这个feature 将作为 Jackson 2.12.x 的一部分发布。在它发布之前,这个问题的答案应该足够了。

标签: java jackson objectmapper


【解决方案1】:

您可以编写自定义字符串反序列化器。(我假设您使用的是 spring)

@Configuration
public class JacksonConfiguration {

    @Bean
    SimpleModule jacksonDeserializerConfiguration() {
        SimpleModule module = new SimpleModule();
        module.addDeserializer(String.class, new StdDeserializer<String>(String.class) {
        @Override
        public String deserialize(JsonParser parser, DeserializationContext context)
                throws IOException {
             if (!parser.hasToken(JsonToken.VALUE_STRING)) {
                //throw ex what do u want
                throw new RuntimeException("String not include quote");
            }
            return StringDeserializer.instance.deserialize(parser, context);
        }
    });
        return module;
    }
}

【讨论】:

    【解决方案2】:

    这应该可以解决您的问题。

    class SomeClass {
        @JsonDeserialize(using=ForceStringDeserializer.class)
        public String stringField;
        public boolean booleanField;
        public float numberField;
    }
    
    
    class ForceStringDeserializer extends JsonDeserializer<String> {
        @Override
        public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
            if (jsonParser.getCurrentToken() != JsonToken.VALUE_STRING) {
                throw deserializationContext.wrongTokenException(jsonParser, JsonToken.VALUE_STRING, "Attempted to parse Integer to String but this is forbidden");
            }
            return jsonParser.getValueAsString();
        }
    }
    

    【讨论】:

    • 为什么它被否决了?我花了几个小时来解决这个问题,并在 Posting 之前在我身边尝试过。其完美的工作解决方案。
    【解决方案3】:

    你只需要像这样设置jackson objectmapper

    JsonFactory factory = new JsonFactory();
    factory.disable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES);
    ObjectMapper mapper = new ObjectMapper(factory)
    

    这应该在序列化/反序列化期间抛出错误

    【讨论】:

    • 这是字段名而不是值
    猜你喜欢
    • 2019-10-31
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多