使用Generic字段将Json反序列化为类

时间:2013-11-19 15:07:12

标签: java json jackson

我目前有以下课程

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转换为一种类型的设置。我在这里做错了什么,或者我会更好只是有一个简单的标记界面,然后从中得到我想要的每种类型的设置?

1 个答案:

答案 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可以做到这一点,但它不会从类中删除类型属性信息。但是在运行时它不会使用它们。这使像杰克逊这样的图书馆能够使用它。