Сопоставьте вложенные объекты JSON с классами Java с помощью Spring RestTemplate

Я знаю, что это может быть просто. Однако я просто не могу заставить его работать.

Итак, я пытаюсь использовать Spring RestTemplate для сопоставления моих данных JSON. У меня есть следующий ответ JSON от вызова отдыха.

{
  "message":"ok",
  "status":"ok",
  "data":[
      {"Name":"Yo",
       "Address":"100 Test Rd"},
      {...},
      {...}
   ]
}

И вот класс, на который я пытаюсь его сопоставить.

@JsonIgnoreProperties(ignoreUnknown = true)
public class Response implements Serializable {

  private String message;
  private String status;
  private List<Data> data;

  // I could also use a array instead
  // private Data[] data;
}

Вот мой класс данных:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Data implements Serializable {

  private String Name;
  private String Address;
}

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

public Reponse getResponse() {
    ResponseEntity<Reponse> responseEntity = restTemplate.getForEntity(Url, Reponse.class);

    return responseEntity.getBody();
}

Теперь вот проблема. Я смог получить «сообщение» и «статус», но когда я пытаюсь записать/распечатать данные, он показывает ноль. Не совсем уверен, что здесь происходит. Мне действительно не помешала бы помощь. Спасибо.


person Ren    schedule 06.03.2015    source источник
comment
у меня такая же проблема вы нашли решение для этого?   -  person user2137817    schedule 18.08.2016
comment
Вы нашли какое-нибудь решение? Благодарю.   -  person Fco    schedule 03.10.2017


Ответы (7)


У меня была аналогичная проблема с RestTemplate, который также не отображал вложенные объекты JSON в мою модель класса, после большого разочарования я решил получить свой JSON как строку (вместо преобразования непосредственно в мой целевой объект) с помощью RestTemplate, а затем использовать библиотеку Google Gson чтобы преобразовать мою строку в мою целевую сущность.

пом.xml

<dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.2.4</version>
    </dependency>

код для вызова RestTemplate:

 ResponseEntity<String> responseEntity = restTemplate.getForEntity(Url,String.class);
Gson gson = new GsonBuilder().create();
Response reponse = gson.fromJson(responseEntity , Response.class);

К сожалению, мне не удалось выяснить, почему мои вложенные объекты не были сопоставлены с помощью RestTemplate в первую очередь, но я надеюсь, что этот обходной путь поможет!

person O. Coburn    schedule 22.01.2017
comment
Я удалил вложенный класс и создал другой класс - person Kay; 25.05.2021

У меня была аналогичная проблема при чтении данных Json из REST API с использованием шаблона Rest. Чтобы разрешить объявление геттеров и сеттеров для списка:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Response implements Serializable {

  private String message;
  private String status;
  private List<Data> data;

 // getters and Setters for the list. 


}

RestTemplate будет внутренне сопоставлять значения из массива списков с соответствующим массивом.

person Abhishek    schedule 22.07.2017

Аннотируйте свойство «данные» с помощью @JsonUnwrapped, как показано ниже.

@JsonIgnoreProperties(ignoreUnknown = true)
public class Response implements Serializable {
    private String message;
    private String status;
    @JsonUnwrapped
    private List<Data> data;
}
person Isank    schedule 22.08.2017

Я столкнулся с той же проблемой. Аннотировать с помощью @JsonProperty:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Data implements Serializable {

    @JsonProperty("Name")
    private String name;

    @JsonProperty("Address")
    private String address;

    // getters / setters for name and address

}

Поля вашего класса Data теперь должны быть заполнены, и вы можете называть свои поля независимо от представления JSON (например, name вместо Name).

person James    schedule 28.02.2018

Я знаю, что это старая тема.

Но для тех, у кого такая же проблема, вы можете использовать MappingJackson2HttpMessageConverter для этой цели с Джексоном.

Пожалуйста, обратитесь к ответу, данному в этой теме.

person Tharindu Rathnayake    schedule 11.04.2019

Пожалуйста, используйте private List<Data> data = new AllarList<Data>( ); и, пожалуйста, предоставьте методы getters() и setters() в обоих классах.

Поместите @JsonInclude(Include.NON_EMPTY) выше класса данных

Пожалуйста, добавьте зависимости ниже в разделе вашего основного файла POM.xml и выполните компиляцию maven. Тогда я думаю, что ваша проблема будет решена.

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.2.3</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.2.3</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-joda</artifactId>
            <version>2.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.8.8</version>
        </dependency>
person sayan    schedule 06.03.2015
comment
Я не стал ставить здесь сеттеры и геттеры, чтобы избежать беспорядка. Пытался инициализировать данные. Все еще возвращает ноль. Также ошибка компиляции в Include.NON_EMPTY, Include не может быть разрешена для переменной? Спасибо. - person Ren; 06.03.2015
comment
пожалуйста, импортируйте это: import com.fasterxml.jackson.annotation.JsonInclude; - person sayan; 06.03.2015

Если вам нужны только данные для печати, вы можете сделать это

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.getForEntity(
    "your url",
    String.class);

System.out.println(response);
person Andrey    schedule 27.03.2016