#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