Как отобразить несколько JsonProperty в одну переменную? - PullRequest
0 голосов
/ 14 мая 2018

Я получил перечисление PrintType и хочу десериализовать пустые строки как тип DEFAULT, как;

@JsonProperty("default", "")
DEFAULT

Есть ли способ сопоставить несколько JsonProperty с одной переменной?

My PrintType enum;

public enum PrintType{

    @JsonProperty("default")
    DEFAULT,


    ....

}

1 Ответ

0 голосов
/ 14 мая 2018

Прежде всего, обратите внимание, что JsonProperty используется для обозначения имен свойств, а не их значений. В этом примере DEFAULT является элементом перечисления, а не его свойством / полем / методом, поэтому эта аннотация не будет подходящей.

Чтобы десериализовать элемент enum из нескольких возможных значений, вам нужно создать простой JsonDeserializer, который будет выполнять сопоставление. Например:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

public class PrintTypeDeserializer extends JsonDeserializer<PrintType> {

  private static final Set<String> DEFAULT_VALUES = new HashSet<>(Arrays.asList("", "default"));

  @Override
  public PrintType deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
    final String value = jsonParser.getValueAsString();
    if (DEFAULT_VALUES.contains(value)) {
      return PrintType.DEFAULT;
    }
    return PrintType.valueOf(value);
  }

}

Чтобы использовать этот десериализатор, либо объявите его в поле PrintType для десериализации:

public class MyObj {

  @JsonProperty("print_type")
  @JsonDeserialize(using = PrintTypeDeserializer.class)
  private PrintType printType;

}

(Но это должно быть дублировано, если PrintType появляется в разных объектах)

Или зарегистрируйте десериализатор в соответствующем ObjectMapper:

private static ObjectMapper initObjectMapper() {
  final ObjectMapper mapper = new ObjectMapper();
  final SimpleModule module = new SimpleModule();
  module.addDeserializer(PrintType.class, new PrintTypeDeserializer());
  mapper.registerModule(module);
  return mapper;
}

Теперь короткий тестовый пример:

public enum PrintType {

  DEFAULT, TYPE_A, TYPE_B;

}

@Test
public void deserializeEnum() {
  final List<String> jsons = Arrays.asList(
      "{ \"print_type\": null }",
      "{ \"print_type\": \"\" }",
      "{ \"print_type\": \"default\" }",
      "{ \"print_type\": \"DEFAULT\" }",
      "{ \"print_type\": \"TYPE_A\" }",
      "{ \"print_type\": \"TYPE_B\" }"
  );

  final ObjectMapper mapper = initObjectMapper();

  jsons.stream().forEach(json -> {
    try {
      System.out.println(mapper.readValue(json, MyObj.class));
    } catch (IOException e) {
      throw new IllegalStateException(e);
    }
  });

}

// output:
//  MyObj(printType=null)
//  MyObj(printType=DEFAULT)
//  MyObj(printType=DEFAULT)
//  MyObj(printType=DEFAULT)
//  MyObj(printType=TYPE_A)
//  MyObj(printType=TYPE_B)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...