Я хотел бы сопоставить строку json и массив с Java-списком. Класс Java выглядит следующим образом.
public class MyDTO {
private String identifier;
@JsonFormat(with=Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
private Map<String, List<String>> parameters;
public String getIdentifier() {
return identifier;
}
public void setIdentifier(String identifier) {
this.identifier = identifier;
}
public Map<String, List<String>> getParameters() {
return parameters;
}
public void setParameters(Map<String, List<String>> parameters) {
this.parameters = parameters;
}
}
Я хотел бы, чтобы оба следующих примера json правильно отображались в указанном выше классе Java.
//sample1
{"Идентификатор": "myIdentifier", "parameters": {"param1": "value"}}
//sample2
{"identifier": "myIdentifier", "parameters": {"param1": ["value1", "value2"]}}
Я попытался использовать ACCEPT_SINGLE_VALUE_AS_ARRAY для свойства Map, но я думаю, что он не применяется к внутреннему списку
Любые решения?
Благодарю.
@JsonFormat
не является подходящей аннотацией для настройки десериализации такого рода. Настройка POJO на основе аннотаций не даст правильного результата. Вместо этого, прими исходную строку JSON и позже десериализуйте с помощью objectmapper с необходимой конфигурацией
String json1 = "{ \"identifier\": \"myIdentifier\", \"parameters\":{ \"param1\": \"value\" } }\n";
String json2 = "{ \"identifier\": \"myIdentifier\", \"parameters\":{ \"param1\": [\"value1\", \"value2\"] } }";
ObjectMapper mapper = new ObjectMapper();
//mapper.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
try {
MyDTO obj1 = mapper.readValue(json1, MyDTO.class);
MyDTO obj2 = mapper.readValue(json2, MyDTO.class);
}catch (Exception e){
// handle
}