使用Jackson ObjectMapper将Json的一部分转换为HashMap

时间:2015-05-07 12:44:59

标签: java json jackson unmarshalling object-object-mapping

我试图以一种方式解组json文件,使得Json的少数属性被映射到我的模型类中存在的HashMap。属性的重置被映射到类的相应字段。请找到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"
      }

这是我想要映射这个Json的Model类:

public class Model{

    private int                              _id;
    private String                           name;
    private int                              age
    private HashMap<String, String> columns;

    //Getters and Setter methods
}

所以在这里,我想要的是获得包含密钥columns的地图"MEMO_TEXT","MEMO_LINK","MEMO_DOB","MEMO_USERNAME","MEMO_CATEGORY","MEMO_UID"

和Json中的其他属性将映射到它们各自的字段。

是否可以使用杰克逊图书馆的ObjectMapper进行此操作?

3 个答案:

答案 0 :(得分:10)

您可以使用@JsonAnySetter来注释要调用的方法&#34;其他&#34;属性:

        var diff = xmldoc1.Descendants("Price").ExceptBy(xmldoc2.Descendants("Price"),
            e => new { ProductId = e.Elements("ProductId").Select(p => p.Value).FirstOrDefault(), EffectiveDate = e.Elements("EffectiveDate").Select(p => p.Value).FirstOrDefault() });

另外,@ JsonAnyGetter做了反向&#34;,所以这应该以相同的方式序列化和反序列化。

答案 1 :(得分:1)

实现目标的几种方法之一是添加构造函数:

@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,则结构将与初始结构不同。

答案 2 :(得分:0)

尝试使用SerializerProvider。 SerializerProvider可以修改反序列化,启用自定义反序列化。