1

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}
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 に答える