json сериализация с переменным полем в виде строки - PullRequest
0 голосов
/ 01 октября 2019

У меня есть pojo, на которое я откликаюсь на ответ REST. Одно из полей («значение переменной») - это просто элемент переменной Json (может быть любой формы). Есть ли способ заставить его обрабатывать поле как простую строку для всех случаев вместо попытки десериализации объекта?

Вот объект json («значение переменной» может быть любой формы):

{"id":1, "variable value": {"name":"one", "age": 22, "data":{"key":"value"}}}

Я хотел бы сохранить этот json как объект класса, используя gson

public class SomeCommand {
    private Long id;
    private String data;
}

1 Ответ

1 голос
/ 02 октября 2019

Звучит так, что вы хотели бы проанализировать заданную строку JSON для преобразования значения переменной в String объект. Вы можете достичь этого, создав 2 класса - SomeCommandOriginal и SomeCommand следующим образом:

Сначала преобразуйте строку JSON в SomeCommandOriginal, чтобы отобразить значение значения переменной в JsonNode.

class SomeCommandOriginal {
    private Long id;
    @JsonProperty("variable value")
    private JsonNode variableValue;

    //general getters and setters
}

class SomeCommand {
    private Long id;
    private String data;

    public SomeCommand(SomeCommandOriginal someCommandOriginal) {
        super();
        this.id = someCommandOriginal.id;
        this.data = someCommandOriginal.variableValue.toString();
    }

    //general getters and setters
}

Во-вторых, инициализируйте экземпляр SomeCommand и передайте someCommandOriginal в качестве аргумента настраиваемого конструктора:

ObjectMapper mapper = new ObjectMapper();
SomeCommandOriginal someCommandOriginal = mapper.readValue(jsonStr, SomeCommandOriginal.class);
SomeCommand someCommand = new SomeCommand(someCommandOriginal);
System.out.println(someCommand.getData());

Вывод на консоль:

{"name": "one", "age": 22, "data": {"key": "value"}}

UPDATED

Если вы используете Gson, просто измените тип данных variableValue на JsonObject и переключитесь на аннотацию @SerializedName следующим образом:

class SomeCommandOriginal {
    private Long id;
    @SerializedName("variable value")
    private JsonObject variableValue;

    //general getters and setters
}

И тогда вы можете получить то же самоерезультат также:

Gson gson = new Gson();
SomeCommandOriginal someCommandOriginal = gson.fromJson(jsonStr, SomeCommandOriginal.class);
SomeCommand someCommand = new SomeCommand(someCommandOriginal);
System.out.println(someCommand.getData());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...