Преобразование строки JSON в общую карту с помощью Джексона - PullRequest
0 голосов
/ 25 апреля 2019

Я получаю следующий объект из другого сервиса, и мне нужно разобрать его в POJO, который есть в моем сервисе.Входящий объект выглядит следующим образом: AddressMessage.java

public class AddressMessage {

    @NotEmpty
    @JsonProperty("id")
    private String id;

    @NotEmpty
    @JsonProperty("address")
    private String address;

    public String getId() {
        return this.id;
    }

    public String getAddress() {
        return this.address;
    }

    @SuppressWarnings("unchecked")
    @JsonProperty("data")
    public void unpackNested(Map<String, Object> rawMessage) {
        Map<String, String> data = (Map<String, String>) rawMessage.get("data");
        this.id = (String) data.get("id");
        this.address = (String) data.get("address");
    }
}

, а входящие данные выглядят следующим образом:

{“data”: { “id” : “sampleId”, “address”: “sampleAddress” }}

Я попытался проанализировать входящую строку json в простой объект, но это нене работает:

private void publishMessage(String rawMessage, AMQP.BasicProperties props) throws IOException {
        Object json = objectMapper.readValue(rawMessage, Object.class);
        log.debug(objectMapper.writeValueAsString(json));

Я также попытался взять необработанное сообщение и отобразить его напрямую в класс, используя объектный преобразователь, например:

private void publishMessage(String rawMessage, AMQP.BasicProperties props) throws IOException {
   AddressMessage addressMessage = objectMapper.readValue(rawMessage, 
   AddressMessage.class);
}

Исключение для приведенного выше кода:

Unexpected character ('“' (code 8220 / 0x201c)): was expecting double-quote to start field name

Я хочу извлечь свойства "id" и "address" из объекта, но продолжаю работать в исключительной ситуации из-за ошибок синтаксического анализа.Некоторые рекомендации будут высоко оценены, спасибо!

Дополнение: я в настоящее время не использую метод "unpackNested", но подумал, что добавлю его на случай, если возникнет какая-либо идея

1 Ответ

2 голосов
/ 25 апреля 2019

Вы можете использовать аннотацию @JsonCreator в конструкторе следующим образом:

@JsonCreator
public AddressMessage(@JsonProperty("data") Map<String, Object> rawJson) {
    this.id = rawJson.get("id").toString();
    this.address = rawJson.get("address").toString();
}

Это говорит Джексону использовать этот конструктор при десериализации.

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