1

我正在尝试使用杰克逊进行反思。更具体地说,我想检索特定类中每个字段的类型、名称和值。我可以使用 获取字段的名称和值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}
4

2 回答 2

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 允许的数据类型(字符串、数字、布尔值、对象、数组和 null)。

如果你想要 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);
}
}
于 2012-08-20T20:59:14.850 回答
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

于 2012-06-20T18:38:07.560 回答