使用 Jackson ObjectMapper 将 Json 的一部分转换为 HashMap
Convert a part of Json to HashMap using Jackson ObjectMapper
我正在尝试解组一个 json 文件,这样 Json 的几个属性被映射到我的模型 class.Rest 中存在的 HashMap 属性是映射到class.Please的各个字段找到下面的Json:
{
"_id":2,
"Name":"xyz",
"Age":20,
"MEMO_TEXT":"yyy",
"MEMO_LINK":"zzz",
"MEMO_DOB":"",
"MEMO_USERNAME":"linie orange",
"MEMO_CATEGORY":2,
"MEMO_UID":"B82071415B07495F9DD02C152E4805EC"
}
这是我要映射到的模型 class Json:
public class Model{
private int _id;
private String name;
private int age
private HashMap<String, String> columns;
//Getters and Setter methods
}
所以在这里,我想要的是获取包含键 "MEMO_TEXT","MEMO_LINK","MEMO_DOB","MEMO_USERNAME","MEMO_CATEGORY","MEMO_UID"
的映射 columns
Json 中的其余属性映射到它们各自的字段。
是否可以使用 Jackson 库的 ObjectMapper 来做到这一点?
尝试使用 SerializerProvider。 SerializerProvider 可以修改反序列化,启用自定义反序列化。
实现您想要的效果的几种方法之一是添加构造函数:
@JsonCreator
public Model(Map<String, Object> fields) {
this._id = (int) fields.remove("_id");
this.name = (String) fields.remove("Name");
this.age = (int) fields.remove("Age");
this.columns = new HashMap<String, String>();
for (Entry<String, Object> column : fields.entrySet()) {
columns.put(column.getKey(), column.getValue().toString());
}
}
请注意,如果您将其序列化回 JSON,结构将与初始结构不同。
您可以使用@JsonAnySetter 注释要为"other" 属性调用的方法:
@Test
public void partial_binding() throws Exception {
Model model = mapper.readValue(Resources.getResource("partial_binding.json"), Model.class);
assertThat(model.name, equalTo("xyz"));
assertThat(model.columns, hasEntry("MEMO_TEXT", "yyy"));
assertThat(
mapper.writeValueAsString(model),
json(jsonObject()
.withProperty("Name", "xyz")
.withProperty("MEMO_TEXT", "yyy")
.withAnyOtherProperties()));
}
public static class Model {
@JsonProperty
private int _id;
@JsonProperty("Name")
private String name;
@JsonProperty("Age")
private int age;
private HashMap<String, String> columns;
@JsonAnyGetter
public HashMap<String, String> getColumns() {
return columns;
}
public void setColumns(HashMap<String, String> columns) {
this.columns = columns;
}
@JsonAnySetter
public void putColumn(String key, String value) {
if (columns == null) columns = new HashMap<>();
columns.put(key, value);
}
}
此外,@JsonAnyGetter "kind of the reverse",所以这应该以相同的方式序列化和反序列化。
我正在尝试解组一个 json 文件,这样 Json 的几个属性被映射到我的模型 class.Rest 中存在的 HashMap 属性是映射到class.Please的各个字段找到下面的Json:
{
"_id":2,
"Name":"xyz",
"Age":20,
"MEMO_TEXT":"yyy",
"MEMO_LINK":"zzz",
"MEMO_DOB":"",
"MEMO_USERNAME":"linie orange",
"MEMO_CATEGORY":2,
"MEMO_UID":"B82071415B07495F9DD02C152E4805EC"
}
这是我要映射到的模型 class Json:
public class Model{
private int _id;
private String name;
private int age
private HashMap<String, String> columns;
//Getters and Setter methods
}
所以在这里,我想要的是获取包含键 "MEMO_TEXT","MEMO_LINK","MEMO_DOB","MEMO_USERNAME","MEMO_CATEGORY","MEMO_UID"
columns
Json 中的其余属性映射到它们各自的字段。
是否可以使用 Jackson 库的 ObjectMapper 来做到这一点?
尝试使用 SerializerProvider。 SerializerProvider 可以修改反序列化,启用自定义反序列化。
实现您想要的效果的几种方法之一是添加构造函数:
@JsonCreator
public Model(Map<String, Object> fields) {
this._id = (int) fields.remove("_id");
this.name = (String) fields.remove("Name");
this.age = (int) fields.remove("Age");
this.columns = new HashMap<String, String>();
for (Entry<String, Object> column : fields.entrySet()) {
columns.put(column.getKey(), column.getValue().toString());
}
}
请注意,如果您将其序列化回 JSON,结构将与初始结构不同。
您可以使用@JsonAnySetter 注释要为"other" 属性调用的方法:
@Test
public void partial_binding() throws Exception {
Model model = mapper.readValue(Resources.getResource("partial_binding.json"), Model.class);
assertThat(model.name, equalTo("xyz"));
assertThat(model.columns, hasEntry("MEMO_TEXT", "yyy"));
assertThat(
mapper.writeValueAsString(model),
json(jsonObject()
.withProperty("Name", "xyz")
.withProperty("MEMO_TEXT", "yyy")
.withAnyOtherProperties()));
}
public static class Model {
@JsonProperty
private int _id;
@JsonProperty("Name")
private String name;
@JsonProperty("Age")
private int age;
private HashMap<String, String> columns;
@JsonAnyGetter
public HashMap<String, String> getColumns() {
return columns;
}
public void setColumns(HashMap<String, String> columns) {
this.columns = columns;
}
@JsonAnySetter
public void putColumn(String key, String value) {
if (columns == null) columns = new HashMap<>();
columns.put(key, value);
}
}
此外,@JsonAnyGetter "kind of the reverse",所以这应该以相同的方式序列化和反序列化。