在给定bean字段名称的情况下,Jackson是否有一个辅助方法来返回@JsonProperty注释值(即JSON属性键)?
上下文
我正在使用Jackson将客户端提供的JSON转换为Bean,然后使用JSR-303来验证bean。验证失败时,我需要向客户端报告有意义的错误消息。验证对象引用bean属性;错误消息应引用JSON属性。因此需要从一个映射到另一个。
答案 0 :(得分:3)
你可以通过BeanDescription
对象获得相当多的信息,虽然获得一个非常棘手(主要是因为它主要是为Jackson内部使用而设计的)。
但这是由一些Jackson扩展模块使用的,所以它是支持的用例。所以:
ObjectMapper mapper = ...;
JavaType type = mapper.constructType(PojoType.class); // JavaType to allow for generics
// use SerializationConfig to know setup for serialization, DeserializationConfig for deser
BeanDescription desc = mapper.getSerializationConfig().introspect(type);
如果需要,您还可以安全地将其翻译为BasicBeanDescription
。
这使您可以访问大量信息;逻辑属性列表(通过它可以找到代表它的getter / setter / field / ctor-argument),完全解析的方法(带注释)等。所以希望这就足够了。 逻辑属性很有用,因为它们既包含外部名称(一个是从JSON预期的名称),另一个是从getter / setter派生的内部名称。
答案 1 :(得分:0)
我不知道杰克逊有什么特别容易的事情。基于反射的解决方案可能就足够了。
import java.lang.reflect.Field;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;
public class JacksonFoo
{
public static void main(String[] args) throws Exception
{
// {"$food":"Green Eggs and Ham"}
String jsonInput = "{\"$food\":\"Green Eggs and Ham\"}";
ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY);
Bar bar = mapper.readValue(jsonInput, Bar.class);
new Jsr303().validate(bar);
// output:
// I do not like $food=Green Eggs and Ham
}
}
class Bar
{
@JsonProperty("$food")
String food;
}
class Jsr303
{
void validate(Bar bar) throws Exception
{
Field field = Bar.class.getDeclaredField("food");
JsonProperty annotation = field.getAnnotation(JsonProperty.class);
System.out.printf("I do not like %s=%s", annotation.value(), bar.food);
}
}