Вспомогательный метод для сопоставления @JsonProperty в JSON Джексона - PullRequest
2 голосов
/ 06 декабря 2011

Есть ли у Джексона вспомогательный метод для возврата значения аннотации @JsonProperty (т. Е. Ключа свойства JSON), заданного именем поля компонента?

Контекст:

Я использую Джексона для преобразования клиентского JSON в Бин, а затем использую JSR-303 для проверки бина.Когда проверка не проходит, мне нужно сообщить клиенту значимое сообщение об ошибке.Объекты проверки ссылаются на свойство bean-компонента;сообщение об ошибке должно ссылаться на свойство JSON.Отсюда необходимость сопоставления одного с другим.

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

Вы можете получить довольно много информации через BeanDescription объект, хотя получить его довольно сложно (в основном потому, что он в основном предназначен для внутреннего использования Джексона).Но это используется несколькими модулями расширения 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-аргумент, который его представляет), полностью разрешенные методы (с аннотациями) и тому подобное.Надеюсь, этого достаточно.Логические свойства полезны, поскольку они содержат как внешнее имя (ожидаемое от JSON), так и внутреннее имя, полученное из getter / setter.

0 голосов
/ 06 декабря 2011

Я ничего не знаю в Джексоне, чтобы сделать это особенно легко. Может быть достаточно решения на основе отражений.

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);
  }
}
...