我目前有以下课程
public class Setting<T> {
private T value;
private T defaultValue;
/* getters and setters */
}
我遇到的麻烦是从Json反序列化,例如,如果Json是
,设置将正常工作{ \"value\": true, \"defaultValue\": false }
..但是,它也会接受
{ \"value\": \"true\", \"defaultValue\": \"false\" }
即使是场地也是场景。根据我的理解,Java删除了所有通用信息,因此jackson无法在运行时查找它。我试过以下
Field currentSettingField = currentSettingsObject.getClass().getDeclaredField("mySetting");
if (currentSettingField != null) {
JavaType settingType = mapper.getTypeFactory().constructType(settingField.getGenericType(), Setting.class);
Setting setting = objectMapper.readValue(currentSettingNode.toString(), settingType);
}
这有点成功,但我仍然可以做一些事情,比如将字符串或整数值从Json转换为一种类型的设置。我在这里做错了什么,或者我会更好只是有一个简单的标记界面,然后从中得到我想要的每种类型的设置?
答案 0 :(得分:0)
根据我从杰克逊的代码中看到的,它最好猜测boolean
的值并匹配字符串:
// And finally, let's allow Strings to be converted too
if (t == JsonToken.VALUE_STRING) {
String text = jp.getText().trim();
if ("true".equals(text)) {
return Boolean.TRUE;
}
if ("false".equals(text)) {
return Boolean.FALSE;
}
if (text.length() == 0) {
return (Boolean) getEmptyValue();
}
throw ctxt.weirdStringException(text, _valueClass, "only \"true\" or \"false\" recognized");
}
因此,如果您将泛型类型更改为Integer或提供不正确的输入,即'tru'
,则无法与其匹配。
“Java删除了所有通用信息”
AFAIK,Java可以做到这一点,但它不会从类中删除类型属性信息。但是在运行时它不会使用它们。这使像杰克逊这样的图书馆能够使用它。