如果你做这样的测试
public static void main(String[] args) throws IOException {
ObjectMapper mapper2 = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(TestClass.class, new TestClassDeserializer());
mapper2.registerModule(module);
TestClass testClass = mapper2.readValue("5 ttt", TestClass.class);
System.out.println(testClass.field);
}
private static class TestClassDeserializer extends JsonDeserializer<TestClass> {
@Override
public TestClass deserialize(final JsonParser p, final DeserializationContext ctxt) throws IOException {
TestClass param = new TestClass();
param.field = p.getValueAsString();
return param;
}
}
public static class TestClass {
public String field;
public TestClass() {
}
public TestClass(final String field) {
this.field = field;
}
}
字符串
你会得到“5”的结果:
我不明白为什么Jackson认为“5 ttt”是一个整数,有可能禁用这种行为吗?
P.S.(感谢Diego Borba的想法,但不幸的是它也不起作用)
如果我为字段添加验证器,就像这样
public static class TestClass {
@JsonDeserialize(using = TestClassDeserializerForInsideField.class)
public String field;
public TestClass() {
}
public TestClass(final String field) {
this.field = field;
}
}
型
并为字段添加验证器:
public class TestClassDeserializerForInsideField extends JsonDeserializer {
@Override
public Object deserialize(final JsonParser p, final DeserializationContext ctxt) throws IOException, JsonProcessingException {
final String valueAsString = p.getValueAsString();
return valueAsString;
}
}
型
这将不起作用。我需要从一个字符串“5 ttt”中创建对象TestClass
。所以,如果我删除模块(TestClassDeserializer
),比Jackson不能理解如何解析输入字符串(在哪个对象中)并抛出一个异常MismatchedInputException: Cannot construct instance
,但如果我添加两个验证器,(TestClassDeserializer
和TestClassDeserializerForInsideField
):Jackson只使用了一个-第一个(TestClassDeserializer
)。而field_parallelizer只是被jackson跳过了。
P.S.这里是我的查询谷歌从浏览器历史记录(为了更好的搜索)jackson convert any string to int
,jackson trim string to int
,JsonDeserializer trim symbols int text whitespace
2条答案
按热度按时间c2e8gylq1#
试试这个方法:
字符串
通过在输入字符串周围添加双引号,像这样:
"5 ttt"
,您显式地向Jackson指示该值应被视为字符串。注意事项:
如果你有任何字符串值,你想用引号括起来,那么你必须小心地使用
writeValueAsString
***。型
如果你不检查字符串是否已经有引号,它会导致在旧的引号周围有额外的引号**,这是错误的!
8nuwlpux2#
在这里,你需要使用
writeValueAsString
方法转换给定的字符串,并将该字符串传递给readValue
方法,如下所示:产品代码:
字符串
输出:
型