我尝试从客户端提供的JSON过滤器构建JPA CriteriaQuery;也就是说,要查询此人POJO:
@Entity
public class Person {
@Id
public Long id;
public String name;
public Date dateOfBirth;
}
客户端会提供类似这样的JSON
{
"$or": [
{ "name": { "$beginsWith": "Jo" } },
{ "dateOfBirth": { "$lessThan": "1983-01-01T00:00:00Z" } }
]
}
解析此过滤器时,我需要从提供的JSON值中获取正确的Java类型,例如: Date
dateOfBirth
。鉴于我可以轻松达到JsonNode
"1983-01-01T00:00:00Z"
并且杰克逊ObjectMapper
知道哪些类型要针对dateOfBirth
Person.class
字段进行反序列化, 我怎么才能得到它?理想情况下,这将是:
// jsonNode is the JsonNode for "1983-01-01T00:00:00Z"
ObjectMapper mapper = new ObjectMapper();
ObjectReader reader = mapper.readerFor(Person.class);
Date date = (Date) reader.asField("dateOfBirth").readValue(jsonNode);
那个asField()
方法可以回归读取JSON string
作为Java Date
的读者(或更常见的是ObjectMapper
将解析的类型应用为该字段注释的[de]序列化程序)。
注意:我不会问如何解析杰克逊的日期,但是如何读取值并获取杰克逊正常反序列化的对象,但是对于嵌套字段。