gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:33:21 27 4
gpt4 key购买 nike

假设我有课

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;
}

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

最佳答案

从 Jackson 2.9 版开始,现在有 DeserializationFeature.FAIL_ON_TRAILING_TOKENS 可用于实现此目的:

ObjectMapper objectMapper =
new ObjectMapper().enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS);

https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.9https://medium.com/@cowtowncoder/jackson-2-9-features-b2a19029e9ff

关于java - 如何使用 Jackson ObjectMapper 检测尾随垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26003171/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com