Разбор JSON и преобразование в список объектов - PullRequest
0 голосов
/ 29 марта 2019

У меня есть ответ json, полученный от API Call. Пример ответа примерно такой:

{
 "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"])

Я хочу преобразовать ответ Above JSON вСписок

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

Любая помощь будет весьма заметна. Заранее спасибо

Ответы [ 3 ]

1 голос
/ 29 марта 2019

Создайте еще 2 класса, например

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

public class Meta {
    String code;
}

, и теперь преобразуйте этот json в класс Temp.

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

ОБНОВЛЕНО:

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

Temp temp = objectMapper.readValue(responseEntity.getBody(), new TypeReference<Temp>(){});
0 голосов
/ 29 марта 2019

Создайте / обновите следующий класс, я сохраняю файл 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());
    }

}
}

output:

44:Malgudi ABC
45:Malgudi, DEF
0 голосов
/ 29 марта 2019

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

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

class Meta {
    String code;
}

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

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

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