当前位置: 首页 > 知识库问答 >
问题:

使用jackson objectmapper反序列化时,如果字符串未双引号,则抛出错误

楚嘉玉
2023-03-14

我有一个JSON:

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

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

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

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

共有3个答案

章建木
2023-03-14

你只需要这样设置jackson objectmapper

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

这将在序列化/反序列化期间引发错误

东郭瀚玥
2023-03-14

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

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();
    }
}
舒博雅
2023-03-14

您可以编写自定义字符串反序列化器。(我假设您正在使用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;
    }
}
 类似资料:
  • 问题内容: 这让我发疯了,所以请您帮忙… 我有一个Java字符串,我想用单引号替换所有反斜杠双引号序列,即使我逃避了我认为必要的替换命令,该命令也不会对字符串产生任何影响。 感谢任何建议。 谢谢。 问题答案: 在Java中,字符串是不可变的。您对字符串执行的任何操作都会产生新的对象。操作后,您需要重新分配值。以下内容可能会对您有所帮助。

  • 问题内容: 我想从字符串中删除一个双引号(“)开头和结尾。 如何在Java中实现呢?谢谢! 问题答案: 您可以为此使用模式。 例如 要了解有关正则表达式的更多信息,请访问http://regular-expression.info。 也就是说,这有点像您要发明CSV解析器的味道。如果是这样,我建议您四处看看现有的库,例如OpenCSV。

  • 如果我使用打印字典,它总是将字符串环绕单引号(): 有没有办法告诉使用双引号()来代替?我希望有以下行为:

  • 我正在尝试使用Jackson将反序列化为,但它不起作用。 我有一个带有LocalDateTime字段的数据类: 我添加了特殊的Jackson数据类型模块: 序列化可以在以下情况下正常工作: 结果字符串: 但反序列化不适用于: 作为错误,我得到: 我错过了什么?我对串行化有效而反序列化无效感到困惑。 MWE:(小格拉德尔Java项目) Main.java: build.gradle:

  • 这是我之前问题的后续。我意识到我需要更具体地说明我的regex案例,以获得适用于我的案例的答案。 我已经与这个正则表达式斗争了很长一段时间(也使用我上一个问题的答案),我似乎无法构建我需要的东西。 我需要将所有字符串中出现的两个重复出现的单引号替换为(因此字符串内部意味着单引号)。这是因为在一种语言(语法)中,字符串中的引号使用<code>‘转义。 这里有一个例子(实际的例子可以包含用< code

  • 我有一个这样的财产: 我需要在其他类中解析时将其作为字符串 但这里是布尔值。 我想我需要做这样的事情。 还有一个像这样的班级 但找不到合适的例子。 这也是