Я не могу удалить ключ JSON, который может содержать строковое значение или другой объект JSON, используя библиотеку Джексона.

Пример: - Ниже приведены два возможных значения.

1 )

"ProviderData": {
    "INVALID": "HEX",
    "#text": "Sample"
}

2 )

"ProviderData": "1C"

Может ли кто-нибудь, пожалуйста, проверить и предложить мне по этому вопросу.

1
AnkammaRao 28 Май 2019 в 19:05

2 ответа

Лучший ответ

Вы можете написать собственный десериализатор и обработать оба этих случая или написать два конструктора для класса 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 пример.

Смотрите также:

  1. Пользовательская десериализация JSON с Джексоном.
  2. последовательно десериализовать с помощью Джексона.
  3. Десериализация строк и объектов с использованием аннотаций Джексона в Java.
0
Michał Ziober 28 Май 2019 в 19:02

Вы можете десериализовать в JsonNode и затем извлечь содержимое по отдельности, или десериализовать в Object и использовать instanceof, чтобы определить, является ли это Map или другим типом, или использовать < a href = "https://www.concretepage.com/jackson-api/jackson-custom-deserializer" rel = "nofollow noreferrer"> пользовательский десериализатор для распаковки данных в пользовательский объект, который обрабатывает оба случая.

0
jspcal 28 Май 2019 в 16:12