Java 用Jackson映射注释
我试图使用Jackson库将一些注释映射到rest响应Java 用Jackson映射注释,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我试图使用Jackson库将一些注释映射到rest响应 @Retention( RetentionPolicy.RUNTIME ) @Target( ElementType.TYPE ) public @interface LogicModule { String id(); int numberOfInputs(); } 我将这些对象转换为JSON的代码是 ... final List<LogicModule> result = new LinkedList<
@Retention( RetentionPolicy.RUNTIME )
@Target( ElementType.TYPE )
public @interface LogicModule
{
String id();
int numberOfInputs();
}
我将这些对象转换为JSON的代码是
...
final List<LogicModule> result = new LinkedList<>();
for (final Class<?> annotatedClass : annotated)
{
final LogicModule moduleInfo = annotatedClass.getAnnotation( LogicModule.class );
result.add(moduleInfo);
}
return Response.ok( result ).build();
。。。
最终列表结果=新建LinkedList();
for(最终类注释类:注释)
{
最终LogicModule moduleInfo=annotatedClass.getAnnotation(LogicModule.class);
结果.添加(moduleInfo);
}
返回Response.ok(result.build();
不幸的是,这将返回一个空列表。我需要如何修改代码以使事情按预期工作?我认为您有两个选项:要么用
@JsonProperty
注释标记注释类型的方法,要么配置一个自定义方法,将所有注释类型的方法视为普通属性
以下是一个示例,显示了以下两个方面:
public class JacksonAnnotation {
@Retention( RetentionPolicy.RUNTIME )
@Target( ElementType.TYPE )
public static @interface LogicModule {
@JsonProperty
String id();
@JsonProperty
int numberOfInputs();
}
@Retention( RetentionPolicy.RUNTIME )
@Target( ElementType.TYPE )
public static @interface LogicModule2 {
String id();
int numberOfInputs();
}
@LogicModule(id = "id", numberOfInputs = 123)
public static class AnnotatedClass {
}
@LogicModule2(id = "id2", numberOfInputs = 321)
public static class AnnotatedClass2 {
}
public static void main(String[] args) throws JsonProcessingException {
List<LogicModule> modules = singletonList(AnnotatedClass.class.getAnnotation(LogicModule.class));
List<LogicModule2> modules2 = singletonList(AnnotatedClass2.class.getAnnotation(LogicModule2.class));
ObjectMapper mapper1 = new ObjectMapper();
System.out.println(mapper1.writerWithDefaultPrettyPrinter().writeValueAsString(modules));
ObjectMapper mapper2 = new ObjectMapper();
mapper2.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
@Override
public PropertyName findNameForSerialization(Annotated a) {
if (a instanceof AnnotatedMethod) {
Class<?> declaringClass = ((AnnotatedMethod) a).getMember().getDeclaringClass();
// checks that this is an annotation method
if (Annotation.class.isAssignableFrom(declaringClass)) {
try {
// exclude the other method defined in the super interface
Annotation.class.getMethod(a.getName());
} catch (NoSuchMethodException e) {
return new PropertyName(a.getName());
}
}
}
return super.findNameForSerialization(a);
}
});
System.out.println(mapper2.writerWithDefaultPrettyPrinter().writeValueAsString(modules2));
}
}
result
是否包含任何内容?是的,它包含多个LogicModule
[ {
"id" : "id",
"numberOfInputs" : 123
} ]
[ {
"id" : "id2",
"numberOfInputs" : 321
} ]