【问题标题】:Stop Jackson reading numbers as String停止杰克逊将数字读取为字符串
【发布时间】:2019-08-19 15:26:48
【问题描述】:

Jackson 将输入数字读取为字符串。作为下面的示例,学生类将名称 4567 读取为字符串。

例如:输入

{
name: 4567
...
}

Java 类

Class Student {

String name;
...
}

Jackson 正在解析 JSON 文本并将数字值映射到字符串字段,我不希望类型转换,即将数字转换为字符串。在这种情况下,Jackson 将值从 int (4567) 转换为 String("4567")。 如果提供的其他类型失败,此行为如何更改以引发异常?

【问题讨论】:

  • @MS90 似乎您误读了这个问题。 Jackson 正在 解析 JSON 文本并将数字值映射到字符串字段,并且 OP 不希望进行类型转换,即将数字转换为字符串。基本上,OP 希望将 JSON 文本视为无效。
  • @MS90 OP 希望 name 成为 String,并希望确保在 解析/反序列化 JSON 时,该值是 JSON 字符串,例如"4567",不是 JSON 编号,例如4567。 Jackson 将值从 int 转换为 String,这是一个非常有用的库,但 OP 希望它失败。 --- “如果他想对内容进行反序列化,他不会有任何问题” OP 的问题是它不会失败。 OP 想要失败。 OP 希望它成为一个问题。
  • @MS90 检查您的假设。 OP 没有将其序列化为 int。 OP 正在解析未知来源的 JSON,并希望 严格解析,以便在 JSON 值类型不正确时失败。为什么你认为 JSON 文本是由 Jackson 创建的?解释一下,问题只是说,“我有这个 JSON,要解析成这个对象,我希望它解析失败,因为类型错误”(“这行为如何改变抛出例外 ?").
  • 感谢@Andreas 的所有澄清。详细说明需求。上面的 JSON 模式是暴露给客户端的 REST API 的一部分。在 API (Swagger) 'name' 参数中标记为字符串。但是现在客户端为它发送 int 并从我们这边(从 API)请求失败。
  • GitHub 上有类似的错误,您可以在其中找到使用默认解串器的解决方案。

标签: java jackson jackson2


【解决方案1】:

java.lang.String 注册的自定义反序列化器绝对可以工作,并且可以防止转换。反序列化器将通过JsonParser 直接查看内容,因此它们可以检测底层令牌类型。

这将对您有所帮助:

public class ForceStringDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        if (jsonParser.getCurrentToken() == JsonToken.VALUE_NUMBER_INT) {
            throw deserializationContext.wrongTokenException(jsonParser, JsonToken.VALUE_STRING, "Attempted to parse int to string but this is forbidden");
        }
        return jsonParser.getValueAsString();
    }
}

您可以找到更多信息here

【讨论】:

  • @MS90 你能澄清更多吗?因为我认为这正是 OP 所需要的!
  • 我想说的是,这在代码中根本没有逻辑。您的答案是正确的,并且符合 OP 要求,但他将名称反序列化为 int 的逻辑对我来说是任何问题。如果他有“例子”而不是名字的数字会发生什么? @Spara
  • @MS90 啊哈,我明白你的意思,你是对的。我希望这个答案对 OP 有所帮助,他知道自己在做什么!
  • @MS90 如果用户输入是除 String 之外的任何其他类型,则应抛出异常。例如:以下应该失败(名称:4567,名称:45.678,名称:true)简单来说,如果没有双引号,它需要失败
  • 如果您在GitHub 上找到此解决方案,您至少可以添加指向它的链接。它包含非常有用的讨论,可能会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多