Как разобрать элемент JSON, который может быть простой строкой или объектом, в Class Object - PullRequest
1 голос
/ 28 мая 2019

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

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

1)

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

2)

"ProviderData": "1C"

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

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

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

вы можете десериализовать до JsonNode и затем извлечь содержимое по отдельности, или десериализовать до Object и использовать instanceof, чтобы определить, является ли он Map или другим типом, или использовать пользовательский десериализатор чтобы распаковать данные в пользовательский объект, который обрабатывает оба случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...