如何使用Jackson将JSON对象转换为Java HashMap?

时间:2017-04-06 05:15:58

标签: java json hashmap jackson

我有这样的JSON结构:

{   
    "person": 
    {
        "name": "snoop",
        "age": "22",
        "sex": "male"
    }
}

这样的豆子:

public class Person {
    HashMap<String,String> map;

    //getters and setters
}

我希望JSON中的所有键和值都在Person类的map中填充。 我不想为JSON中的每个键创建bean,例如int ageString name等。

我尝试过以下示例,它适用于正常的JSON结构,如下所示:

{
    "type": "Extends",
    "target": "application",
    "ret": "true"
}

和程序是:

String jsonString = "{\"type\": \"Extends\", \"target\": \"application\", \"ret\":\"true\" }";

ObjectMapper mapper = new ObjectMapper();
try {
    Map<String, Object> carMap = mapper.readValue(jsonString, new TypeReference<Map<String, Object>>() {
    });

    for (Entry<String, Object> entry : carMap.entrySet()) {
        System.out.println("key=" + entry.getKey() + " and value=" + entry.getValue());
    }

} catch (Exception e) {
    e.printStackTrace();
}

以上程序运行正常,并从JSON获取Hashmap中的值。但是在前面提到的Hashmap的情况下:

{   
    "person": 
    {
        "name": "snoop",
        "age": "22",
        "sex": "male"
    }
}

由于Hashmap为空,因此无法正常工作并提供NullPointerException

我们是否可以使用Jackson API在Person类中填充Hashmap。

1 个答案:

答案 0 :(得分:3)

在此处使用JsonAnyGetterJsonAnySetter注释。

E.g:

Perosn课程:

@JsonRootName("person")
class Person {
    HashMap<String, String> map = new HashMap<>();

    @JsonAnyGetter
    public Map<String, String> getMap() {
        return map;
    }

    @JsonAnySetter
    public void setMap(String name, String value) {
        map.put(name, value);
    }

}

反序列化逻辑:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
Person person = mapper.readValue(jsonString, Person.class);