我有这样的JSON结构:
{
"person":
{
"name": "snoop",
"age": "22",
"sex": "male"
}
}
这样的豆子:
public class Person {
HashMap<String,String> map;
//getters and setters
}
我希望JSON中的所有键和值都在Person类的map中填充。
我不想为JSON中的每个键创建bean,例如int age
,String 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。
答案 0 :(得分:3)
在此处使用JsonAnyGetter
和JsonAnySetter
注释。
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);