parser - objectmapper java




JSON Jackson разбирает разные ключи в одном поле (2)

Более кратко, я бы предложил использовать две отдельные аннотации @JsonSetter для этого. Вот рабочий пример. Это означает, что ваш класс java будет использовать только один метод getter для свойства вместо двух. Вы также можете сделать сеттер, который вы не хотите использовать для клиентов Media private, и обрабатывать один из json-ключей особым образом.

import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.databind.ObjectMapper;

@SuppressWarnings("unused")
public class Media {

    private Asset asset;

    @JsonGetter("asset")
    public Asset getAsset() {
        return asset;
    }

    @JsonSetter("asset")
    public void setAsset(Asset asset) {
        this.asset = asset;
    }

    @JsonSetter("cover_asset")
    private void setMediaAsset(Asset asset) {
        if (this.asset == null) {
            setAsset(asset);
        }
    }


    private static class Asset {
        @JsonProperty("foo")
        private String foo;
    }

    public static void main(String[] args) throws Exception {
        String withAsset = "{'asset': {'foo':'bar'}}";
        String withCoverAsset = "{'cover_asset': {'foo':'bar'}}";

        ObjectMapper mapper = new ObjectMapper();
        Media mediaFromAsset = mapper.readValue(withAsset.replace('\'','"'), Media.class);
        Media mediaFromCoverAsset = mapper.readValue(withCoverAsset.replace('\'','"'), Media.class);

        System.out.println(mediaFromAsset.asset.foo.equals(mediaFromCoverAsset.asset.foo));

    }
}

У меня есть POJO, у которого есть поле:

public class Media {
 private Asset asset;
}

Все работает отлично, анализируя ответ json в этот актив POJO. но, однако, есть небольшая разница с ключом, к которому относится этот актив. Это может быть:

  @JsonProperty("cover_asset")

или

  @JsonProperty("asset")

Есть ли способ аннотировать POJO для распознавания этого случая и де-сериализации в одно и то же поле. Невозможно, чтобы они оба отображались в одном ответе.


Ну, так как только десериализация - это ваша забота, @JsonAlias представленная в 2.9 , идеально подходит для этой ситуации. Вы можете сделать что-то вроде этого:

@JsonAlias({"cover_asset", "asset"})
private Asset asset;

@JsonAlias :

Аннотации, которые могут использоваться для определения одного или нескольких альтернативных имен для свойства, принятого во время десериализации в качестве альтернативы официальному названию. Информация о псевдониме также отображается во время самоанализа POJO, но не имеет эффекта во время сериализации, где всегда используется первичное имя.

Примечание. Убедитесь, что вы обновляете все связанные зависимости ( annotations , core , databind ), если вы их используете. Обновление только annotations без других бросило мне ошибку времени выполнения.





jackson