Десериализация вложенных объектов 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=''}]}
→ Ссылка