Java 使用Jackson JSON查找字段类型

Java 使用Jackson JSON查找字段类型,java,reflection,annotations,jackson,Java,Reflection,Annotations,Jackson,我正在尝试使用Jackson进行反射。 更具体地说,我想检索特定类中每个字段的类型、名称和值。我可以使用ObjectMapper获取字段的名称和值,但似乎找不到检索类型的方法。我的代码如下: ObjectMapper mapper = new ObjectMapper(); University uni = new University(); String uniJSON = mapper.writeValueAsString(uni); System.out.println(uniJSON)

我正在尝试使用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}

使用Jackson注释对域类进行注释:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="type")
public class University {
有关更多信息,请参见此:

使用Jackson注释为您的域类添加注释:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="type")
public class University {
有关更多信息,请参见此: 您可以使用以下方法

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

如果需要Java类型,应该使用反射。请注意,存在循环引用、数组等复杂问题。如果您知道要标识其类型的属性的名称,可以执行类似的操作。如果传递“principal.name”之类的参数,则此操作适用于嵌套属性

私有类getPropertyType(类clazz,字符串属性){
试一试{
LinkedList属性=新建LinkedList();
properties.addAll(Arrays.asList(property.split(“\\”));
字段=空;
而(!properties.isEmpty()){
field=clazz.getDeclaredField(properties.removeFirst());
clazz=field.getType();
}
返回字段。getType();
}捕获(例外e){
抛出新的运行时异常(e);
}
}
您可以使用以下方法

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

如果需要Java类型,应该使用反射。请注意,存在循环引用、数组等复杂问题。如果您知道要标识其类型的属性的名称,可以执行类似的操作。如果传递“principal.name”之类的参数,则此操作适用于嵌套属性

私有类getPropertyType(类clazz,字符串属性){
试一试{
LinkedList属性=新建LinkedList();
properties.addAll(Arrays.asList(property.split(“\\”));
字段=空;
而(!properties.isEmpty()){
field=clazz.getDeclaredField(properties.removeFirst());
clazz=field.getType();
}
返回字段。getType();
}捕获(例外e){
抛出新的运行时异常(e);
}
}

是否希望输出json包含具有类名的属性?也许您可以向我们展示您期望的输出……您希望输出json包含一个具有类名的属性吗?也许你可以向我们展示你期望的输出。。。