使用Jackson JSON查找字段类型

时间:2012-06-20 17:59:27

标签: java reflection annotations jackson

我想用杰克逊做反思。 更具体地说,我想检索特定类中每个字段的类型,名称和值。我可以使用ObjectMapper获取字段的名称和值,但我似乎无法找到检索类型的方法。我的代码如下:

ObjectMapper mapper = new ObjectMapper();

University uni = new University();
String uniJSON = mapper.writeValueAsString(uni);
System.out.println(uniJSON);

输出:

{"name":null,"ae":{"annotationExampleNumber":0},"noOfDepartments":0,"departments":null}

2 个答案:

答案 0 :(得分:1)

您可以使用generateJsonSchema方法,如下所示

try{
    ObjectMapper json=new ObjectMapper();
    json.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    System.out.println(json.generateJsonSchema(University.class).toString());
}catch(Exception e){
    throw new RuntimeException(e);
}

这将生成一个json模式,您可以读取该模式以获取字段数据类型。请注意,此方法会生成JSON架构,因此,它仅使用JSON允许的数据类型(字符串,数字,布尔值,对象,数组和空值)。

如果您想要Java类型,则应使用反射。请注意,存在诸如循环引用,数组等复杂问题。如果您知道要尝试识别其类型的属性的名称,则可以执行与此类似的操作。如果传递像“principal.name”

这样的参数,这适用于嵌套属性
private Class<?> getPropertyType(Class<?> clazz,String property){
try{
    LinkedList<String> properties=new LinkedList<String>();
    properties.addAll(Arrays.asList(property.split("\\.")));
    Field field = null;
    while(!properties.isEmpty()){
        field = clazz.getDeclaredField(properties.removeFirst());
        clazz=field.getType();
    }
    return field.getType();
}catch(Exception e){
    throw new RuntimeException(e);
}
}

答案 1 :(得分:0)

使用Jackson注释注释您的域类:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="type")
public class University {

有关详情,请参阅此处: http://www.cowtowncoder.com/blog/archives/2010/03/entry_372.html