Jackson2编组包装类与泛型

时间:2016-10-14 15:09:25

标签: java jackson

我有一个包装器json对象,例如

public class M1lhaoController : Controller
{
    private Sorteio db = new Sorteio();

    public ActionResult Index(int id = 1)
    {
        var data = db.Database.ExecuteSqlCommand("SELECT * From M1lhao WHERE DrawID = {0}", id); // the variable data comes as -1
        M1lhao m1lhao = db.M1lhao.Find(id);
        if (m1lhao == null)
        {
            return HttpNotFound();
        }
        return View(db.M1lhao.ToList());
    }

}

我的java对象看起来像这样

{
  "id": 23,
  "name": "teset",
  "type": "person",
  "_data": {
    "address": 23432
  }
}

我无法找到使对象映射器执行此操作的方法

public class Wrapper<D>{ private Integer id; private String type; @JsonProperty("_data") private D data; ... }

这是不受支持的,我无法在杰克逊找到有关仿制药的更多信息。

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

  • 主要问题是您未在Wrapper调用中指定所需的参数化类型readValue。您可以使用(简化形式):Wrapper<Person> wrapped = om.readValue(json, new TypeReference<Wrapper<Person>>() {});
  • 来解决此问题
  • 此外,您的JSON具有name属性,该属性显然不在您的Wrapper类中。您拥有它并且尚未发布,或者您可以将ObjectMapper配置为忽略未知属性:objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

以下是一个例子:

public static class Wrapper<D> {
    // making fields public for simplicity, 
    // use public getters and private fields of course
    public Integer id;
    public String type;
    @JsonProperty("_data")
    public D  data;
}
public static class Person {
    // adding address field as a public int, 
    // same as above, encapsulate properly in real life
    public int address;
}

然后,在某个主要方法......

ObjectMapper om = new ObjectMapper();
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

// your example JSON
String json = "{\"id\":23,\"name\":\"test\",\"type\":\"person\",\"_data\":"
+ "{\"address\":23432}}";
Wrapper<Person> wrapped = om.readValue(
    json, new TypeReference<Wrapper<Person>>() {}
);

// printing class/hashCode of the resolved generic type
System.out.println(wrapped.data);
// casting as Person and printing actual property
System.out.println(((Person)wrapped.data).address);

输出(类似于......)

test.Main$Person@dfd3711
23432
来自docsTypeReference

解释

  

此通用抽象类用于获取完整的泛型类型   分类信息;它必须转换为ResolvedType   实现(由JavaType从“数据绑定”包实现)   用过的。课程基于来自的想法   http://gafter.blogspot.com/2006/12/super-type-tokens.html,附加   想法(根据文章评论中提出的建议)是要求的   伪造的Comparable实现(任何这样的通用接口都会   do,只要它强制使用泛型类型的方法   实现)。确保确实给出了Type参数。

     

用法是通过子类化:这是实例化引用的一种方法   泛型类型列表:

     

TypeReference ref = new TypeReference<List<Integer>>() { };

     

可以传递给接受TypeReference或已解决的方法   使用TypeFactory获取ResolvedType。