我有一个包装器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;
...
}
这是不受支持的,我无法在杰克逊找到有关仿制药的更多信息。
答案 0 :(得分:1)
您的代码存在一些问题:
Wrapper
调用中指定所需的参数化类型readValue
。您可以使用(简化形式):Wrapper<Person> wrapped = om.readValue(json, new TypeReference<Wrapper<Person>>() {});
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
来自docs的TypeReference
解释:
此通用抽象类用于获取完整的泛型类型 分类信息;它必须转换为ResolvedType 实现(由JavaType从“数据绑定”包实现) 用过的。课程基于来自的想法 http://gafter.blogspot.com/2006/12/super-type-tokens.html,附加 想法(根据文章评论中提出的建议)是要求的 伪造的Comparable实现(任何这样的通用接口都会 do,只要它强制使用泛型类型的方法 实现)。确保确实给出了Type参数。
用法是通过子类化:这是实例化引用的一种方法 泛型类型列表:
TypeReference ref = new TypeReference<List<Integer>>() { };
可以传递给接受TypeReference或已解决的方法 使用TypeFactory获取ResolvedType。