当前位置: 首页 > 面试题库 >

如何使用Jackson ObjectMapper检测尾随垃圾

孔硕
2023-03-14
问题内容

说我有一堂课

class A {
    public int x;
}

然后可以按如下方式解析有效的json:

ObjectMapper mapper = new ObjectMapper();
A a = mapper.readValue("{\"x\" : 3}", A.class);

如果字符串包含的数据多于解析对象所需的数据,是否有办法使解析器失败?

例如,我希望以下操作失败(成功)

A a = mapper.readValue("{\"x\" : 3} trailing garbage", A.class);

我使用带有JsonParser.Feature.AUTO_CLOSE_SOURCE =
false的InputStream尝试了此操作,并检查该流是否已被完全消耗,但这不起作用:

A read(String s) throws JsonParseException, JsonMappingException, IOException {
    JsonFactory f = new MappingJsonFactory();
    f.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, false);
    ObjectMapper mapper = new ObjectMapper(f);
    InputStream is = new ByteArrayInputStream(s.getBytes(StandardCharsets.UTF_8));
    try {
        A a = mapper.readValue(is, A.class);
        if(is.available() > 0) {
            throw new RuntimeException();
        }
        return a;
    } finally {
        is.close();
    }
}

那是,

read("{\"x\" : 3} trailing garbage");

仍然成功,可能是因为解析器从流中消耗了超出严格必要的更多信息。

一种有效的解决方案是验证从字符串中删除最后一个字符时解析是否失败:

A read(String s) throws JsonParseException, JsonMappingException, IOException {
    ObjectMapper mapper = new ObjectMapper();
    A a = mapper.readValue(s, A.class);

    if (s.length() > 0) {
        try {
            mapper.readValue(s.substring(0, s.length()-1), A.class);
            throw new RuntimeException();
        } catch (JsonParseException e) {
        }
    }

    return a;
}

但我正在寻找一种更有效的解决方案。


问题答案:

主要要做的是分别创建一个JsonParser第一个,然后调用ObjectMapper.readValue()传递该解析器的代码,然后nextToken()再次调用并验证其返回null(而不是非null值或引发异常)。

所以,像

JsonParser jp = mapper.getFactory().createParser(jsonSource);
try {
    Value v = mapper.readValue(jp, Value.class);
    if (jp.nextToken() != null) {
        //throw some exception: trailing garbage detected
    }
    return v;
} finally {
    jp.close();
}

注意:这适用于Jackson2.x。对于Jackson
1.x,请使用getJsonFactory().createJsonParser()代替getFactory().createParser()



 类似资料:
  • 问题内容: 我正在做蛇游戏,并且被困在使尾巴跟着头部的位置。我听说在头和尾上使用添加和删除操作可能会发生这种情况,但是我不知道从哪里开始。 到目前为止,这是我的代码: Screen.java BodyPart.java 框架 现在这段代码只会使尾巴翻转到水平或垂直方向,是否可以通过使用此代码使尾巴跟随头部?还是我需要更改代码? 谢谢 问题答案: 基本思想是,您需要某种包含蛇的所有点的东西。从概念上

  • 问题内容: 我搜索了类似的问题,但没有一个帮助。 考虑一个文件: 你好你好吗? 当时你在哪里? 我想在每行结束后进行一些操作。如果我使用它,则不会告诉我何时到达第一行的末尾。 我也看到了,但是它只会告诉我是否存在另一行。 问题答案: 考虑使用多个扫描仪,一个扫描仪获取每一行,另一扫描仪扫描每行。我唯一要说明的是,使用完内部扫描仪后,请务必确保将其关闭。实际上,使用完 所有 扫描仪后,您将需要关闭它

  • 问题内容: 我正在尝试使用round函数,并且不显示任何尾随零,但最后仍显示一些零。我想得到10.4,但得到这样的东西: 这是我的SQL: 如何在此处删除尾随零?我只需要显示10.4。 问题答案: 您只需要将其强制转换为十进制(12,2)。

  • 我意识到消息中的前16个字节是IV,所以我从消息中去掉了它们(从消息开始就去掉了垃圾)。但是现在我在消息的末尾得到了随机的5个字节。这些字节是: 其他职能: 消息有没有可能是随机填充的? -----编辑----- 看来规范使用的是ISO10126填充,用“AES/CBC/ISO10126Padding”代替“AES/CBC/NOPadding”。

  • 问题内容: 我有一个领域: 我想在不对其进行“更正”的情况下进行打孔,以便显示。 问题答案: 我对此进行了一些尝试,并查看了规格。它说它必须是一个有效的浮点数。在给出的有效浮点数的定义中有一句话引起了我的注意: 数字n作为浮点数 的 最佳表示形式 是通过将JavaScript运算符ToString应用于n获得的字符串。 这意味着格式将始终与评估数字一致,然后对该数字使用JavaScript的toS

  • 问题内容: Python与Perl 函数等效吗?如果是换行符,该函数将删除字符串的最后一个字符? 问题答案: 试用该方法(请参阅doc Python 2和Python 3)