Jackson JSON中@JsonProperty映射的Helper方法

时间:2011-12-06 04:44:30

标签: java jackson bean-validation

在给定bean字段名称的情况下,Jackson是否有一个辅助方法来返回@JsonProperty注释值(即JSON属性键)?

上下文

我正在使用Jackson将客户端提供的JSON转换为Bean,然后使用JSR-303来验证bean。验证失败时,我需要向客户端报告有意义的错误消息。验证对象引用bean属性;错误消息应引用JSON属性。因此需要从一个映射到另一个。

2 个答案:

答案 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);
  }
}