Вы можете написать собственный десериализатор и обработать оба этих случая или написать два конструктора для класса ProviderData
POJO
и правильно использовать аннотации JsonCreator и JsonCreator . Смотрите ниже пример:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue(jsonFile, Response.class));
}
}
class Response {
@JsonProperty("ProviderData")
private ProviderData data;
// getters, setters, toString
}
class ProviderData {
private static final String INVALID_NAME = "INVALID";
private static final String TEXT_NAME = "#text";
@JsonProperty(INVALID_NAME)
private final String invalid;
@JsonProperty(TEXT_NAME)
private final String text;
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public ProviderData(String invalid) {
this(invalid, null);
}
@JsonCreator
public ProviderData(@JsonProperty(INVALID_NAME) String invalid, @JsonProperty(TEXT_NAME) String text) {
this.invalid = invalid;
this.text = text;
}
// getters, toString
}
Для этого JSON
полезная нагрузка:
{
"ProviderData": {
"INVALID": "HEX",
"#text": "Sample"
}
}
Приведенный выше пример печатает:
Response{data=ProviderData{invalid='HEX', text='Sample'}}
А для String
Примитив JSON
Полезная нагрузка:
{
"ProviderData": "1C"
}
Пример печати выше:
Response{data=ProviderData{invalid='1C', text='null'}}
Как видите, JSON Object
отображается правильно с помощью конструктора 2-arg
, а String
отображается с помощью конструктора 1-arg
, и мы предполагаем, что это значение означает ключ invalid
из примера JSON Object
.
Смотри также:
- Пользовательская десериализация JSON с Джексоном .
- последовательно десериализовать, используя Джексона .
- Десериализация строк и объектов с использованием аннотаций Джексона в java .