Разбор JSON и преобразование в список объектов

#java #json #spring-boot

#java #json #весенняя загрузка

Вопрос:

У меня есть ответ json, полученный от вызова API, пример ответа выглядит примерно так

 {
 "meta": {
   "code": "200"
  },
 "data": [
   {
    "Id": 44,
    "Name": "Malgudi ABC"
  },
  {
    "Id": 45,
    "Name": "Malgudi, DEF"
  }
]
}
  

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

 private static List<TPDetails> getListOfTpDetails(ResponseEntity<?> responseEntity){
       ObjectMapper objectMapper = new ObjectMapper();
        List<TPDetails> tpDetailsList = objectMapper.convertValue(responseEntity.getBody().getClass(), new TypeReference<TPDetails>(){});
        return tpDetailsList;
    }
  

Где объект TPDetails выглядит следующим образом

 public class TPDetails {
    int Id;
    String Name;
}
  

код, который я использовал, приводит к

 java.lang.IllegalArgumentException: Unrecognized field "meta" (class com.sbo.abc.model.TPDetails), not marked as ignorable (2 known properties: "Id", "Name"])
 at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: com.sbo.abc.model.TPDetails["meta"])
  

Я хочу преобразовать приведенный выше ответ JSON в список

 List<TPDetails> abc = [
{"Id": 44, "Name": "Malgudi ABC"},
{"Id": 45,"Name": "Malgudi DEF"}
]
  

Любая помощь была бы весьма ценной.Заранее спасибо

Комментарии:

1. Какие библиотеки вы хотите использовать, или у вас нет предпочтений?

Ответ №1:

Создайте еще 2 класса, таких как

 public class Temp {
    Meta meta;
    List<TPDetails> data;
}

public class Meta {
    String code;
}
  

а теперь преобразуйте этот json во временный класс.

 Temp temp = objectMapper.convertValue(responseEntity.getBody().getClass(), new TypeReference<Temp>(){});
  

ОБНОВЛЕНО :

Убедитесь, что responseEntity.getBody() возвращает точную строку Json, которую вы упомянули выше.

 Temp temp = objectMapper.readValue(responseEntity.getBody(), new TypeReference<Temp>(){});
  

Комментарии:

1. java.lang. Исключение IllegalArgumentException: не удается десериализовать экземпляр java.util.ArrayList из токена START_OBJECT в [Источник: НЕИЗВЕСТЕН; строка: -1, столбец: -1] (через цепочку ссылок: com.sbo.abc.model. TPWrapper[«данные»]) null, это то, что я получаю при разборе данных

2. @NTanwar используйте responseEntity.getBody() вместо responseEntity.getBody().getClass() . и вы уверены, convertValue что хотите использовать именно эту функцию. Я думаю, readValue это функция

3. Не удается разрешить метод ‘readValue(захват<?>, анонимный com.fasterxml.jackson.core.type. Ссылка на тип<com.sbo.abc.model. TPWrapper>)’ — это то, что я получаю, класс TPWrapper выглядит следующим образом « @Data @JsonInclude(JsonInclude. Включить.NON_NULL) @JsonPropertyOrder({ «meta», «data» }) открытый класс TPWrapper { @JsonIgnoreProperties(«meta») TPMeta meta; @JsonProperty(«данные») Список<TPDetails> данных; } «

Ответ №2:

Формат вашего java-класса не отражает json, который вы анализируете. Я думаю, что это должно быть:

 class Response {
    Meta meta;
    List<TPDetails> data;
}

class Meta {
    String code;
}
  

Затем вы должны перейти Response к своему TypeReference : new TypeReference<Response>(){}

Если вас не волнует meta поле, вы можете добавить @JsonIgnoreProperties в свой класс response и избавиться от Meta класса и поля.

Комментарии:

1. java.lang. Исключение IllegalArgumentException: не удается десериализовать экземпляр java.util.ArrayList из токена START_OBJECT в [Источник: НЕИЗВЕСТЕН; строка: -1, столбец: -1] (через цепочку ссылок: com.sbo.abc.model. TPWrapper[«данные»]) null — это то, что я получил

2. @NTanwar у вас есть методы получения, установки и пустой конструктор в классах?

3. @Data @JsonInclude(JsonInclude. Включить.NON_NULL) @JsonPropertyOrder({ «meta», «data» }) открытый класс TPWrapper { @JsonIgnoreProperties(«meta») TPMeta meta; @JsonProperty(«данные») Список<TPDetails> данных; } я использую lombok и аннотации, поэтому не нужно писать это явно

4. Теперь я заметил, почему вы используете convertValue метод вместо readValue ? Кроме того, я добавил эту конфигурацию в objectmapper, и она работает должным образом: objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)

Ответ №3:

Создайте / обновите следующий класс, я сохраняю файл JSON, поскольку у меня нет сервиса, но он должен быть в порядке и способен анализировать его и читать из следующей модели.

 import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import java.util.List;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "meta",
        "data"
})
public class OuterPoJo {

    @JsonProperty("meta")
    private Meta meta;
    @JsonProperty("data")
    private List<TPDetails> data = null;

    @JsonProperty("meta")
    public Meta getMeta() {
        return meta;
    }

    @JsonProperty("meta")
    public void setMeta(Meta meta) {
        this.meta = meta;
    }

    @JsonProperty("data")
    public List<TPDetails> getData() {
        return data;
    }

    @JsonProperty("data")
    public void setData(List<TPDetails> data) {
        this.data = data;
    }
}

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "code"
})
public class Meta {

    @JsonProperty("code")
    private String code;

    @JsonProperty("code")
    public String getCode() {
        return code;
    }

    @JsonProperty("code")
    public void setCode(String code) {
        this.code = code;
    }

}

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "Id",
        "Name"
})
public class TPDetails {

    @JsonProperty("Id")
    private Integer id;
    @JsonProperty("Name")
    private String name;

    @JsonProperty("Id")
    public Integer getId() {
        return id;
    }

    @JsonProperty("Id")
    public void setId(Integer id) {
        this.id = id;
    }

    @JsonProperty("Name")
    public String getName() {
        return name;
    }

    @JsonProperty("Name")
    public void setName(String name) {
        this.name = name;
    }

}


import java.io.File;
public class App {
public static void main(String[] args) throws Exception {
    ObjectMapper objectMapper = new ObjectMapper();
    OuterPoJo myPoJo = objectMapper.readValue(
            new File("file.json"),
            OuterPoJo.class);

    for (TPDetails item : myPoJo.getData()) {
        System.out.println(item.getId()   ":"   item.getName());
    }

}
}
  

вывод:

 44:Malgudi ABC
45:Malgudi, DEF