Десериализация вложенных объектов json
Есть json
{
"params": [
{
"key": "path",
"options": {
"string": {
"prefix": "test_pref"
}
},
"default": {
"url": ""
}
}
]}
Есть POJO с ломбоком
@Data
@Accessors(chain = true)
public class Data{
private List<Params> params;
}
@Data
@Accessors(chain = true)
public class Params {
private String key;
@JsonProperty("options.string.prefix")
private String prefix;
@JsonProperty("default.url")
private String url;
}
Почему поля prefix и url не десериализуются? Кажется что @JsonProperty должен работать. Если нет, то через какую аннотацию можно прокинуть путь к объекту? Использую java, lombok, jackson.
Ответы (2 шт):
Автор решения: Danil Apsadikov
→ Ссылка
Где вы нашли такой пример использования этой аннотации в JAVA?
@JsonProperty("options.string.prefix")
Попробуйте создать для каждого вложенного свойства java объект
@Data
@Accessors(chain = true)
public class Params {
private String key;
...
@JsonProperty("default")
private Default default;
}
@Data
@Accessors(chain = true)
public class Default {
@JsonProperty("url")
private String url;
}
Автор решения: Vadik
→ Ссылка
Вы можете написать свой десериализатор для модели Params, выглядеть он будет так:
public class ParamsDeserializer extends JsonDeserializer<Params> {
@Override
public Params deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonNode node = p.getCodec().readTree(p);
Params params = new Params();
params.key = node.get("key").asText();
params.prefix = node.get("options").get("string").get("prefix").asText();
params.url = node.get("default").get("url").asText();
return params;
}
}
Не забудьте его зарегистрировать с помощью аннотации @JsonDeserialize:
public class Data {
public List<Params> params;
}
@JsonDeserialize(using = ParamsDeserializer.class)
public class Params {
public String key;
public String prefix;
public String url;
}
Читаем json так:
Data data = new ObjectMapper().readValue(json, Data.class);
Результат:
Data{params=[Params{key='path', prefix='test_pref', url=''}]}