Извлеките внутренний JSON объект как строку в Джексоне - PullRequest
0 голосов
/ 21 апреля 2020

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

[
    {
      "_foo": "foo-value",
      "_bar": {// bar json object }
    },
    {
      "_foo": "foo-value",
      "_bar": {// bar json object }
    }
]

Мне не важен объект bar JSON, поэтому я просто хочу проанализировать его как String. Вот как выглядит мой класс Pojo:

@Data
public class Document {

  @JsonProperty("_foo")
  private String foo;

  @JsonProperty("_bar")
  private String bar;
} 

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

List<Document> docs = mapper.readValue(fileContent, new TypeReference<List<Document>>() {
        })

Исключение:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token

Какую часть я делаю неправильно?

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Проблема в "_bar": {// bar json object }

Джексон считает это JSON_OBJECT, а не String.

Вы можете создать класс для Bar и использовать как,

@JsonProperty("_bar")
private Bar bar;

Вы также можете попробовать с JSONNode,

@JsonProperty("_bar")
private JsonNode bar;
1 голос
/ 21 апреля 2020

Если вам все равно, вы можете проигнорировать это свойство:

@Data
@JsonIgnoreProperties(value = {"_bar"})
public static class Document { ...

или вы можете добавить установщик с JsonNode:

    @JsonProperty("_bar")
    private String bar;

    @JsonSetter
    private void setBar(JsonNode jsonNode) {
        this.bar = jsonNode.toString();
    }

    private void setBar(String bar) {
        this.bar = bar;
    }

или использовать вместо него JsonNode:

    @JsonProperty("_bar")
    private JsonNode bar;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...