首页 > 解决方案 > 如何从 gson 获取嵌套数据?

问题描述

我对外部 RESTful api 做了一个 get 请求,并接收到一个具有以下结构的 json 对象作为响应:

{
    "data": {
       "id": 1,
       "name": "John Doe",
       "email": "doe@john.com",
       "urlPicture": "urlPicture.com/82819",
       "address": {
          "street": "My street",
          "number": "29",
          "city": "Nurnberg",
          "country": "Germany"
       }
    }
}

我不需要此响应的所有内容,我只想将一些字段保存在数据库中。

我的 POJO 类类似于这个伪代码:


    public class Data{
        private User user;

        // getters and setters
    }

    public class User{
        private int id;
        private String name;
        private String urlPicture;
        private String country;

        // getters and setters
    }

但是,当我尝试提取我想要的字段时,我在这个字段中收到 null


    public void testResponse(){
        RestTemplate restTemplate = new RestTemplate();
        Data data = new Data();
        User user = new User();
        Gson gson = new Gson();

        String response = restTemplate.getForObject(
                    "https://apifrommyrequest.com/user/{id}",
                    String.class,
                    73442);
        user = gson.fromJson(response, User.class);
        System.out.println(user);
    }
    ```

My output:
22:20:57.641 [main] DEBUG org.springframework.web.client.RestTemplate - HTTP GET https://apifrommyrequest.com/user/73442
22:20:57.672 [main] DEBUG org.springframework.web.client.RestTemplate - Accept=[text/plain, application/json, application/*+json, */*]
22:20:58.243 [main] DEBUG org.springframework.web.client.RestTemplate - Response 200 OK
22:20:58.247 [main] DEBUG org.springframework.web.client.RestTemplate - Reading to [java.lang.String] as "application/json;charset=UTF-8"
Data(id=0, name=null, urlPicture=null, country=null)

I really don't know how to do anymore.

标签: javaspring-bootgsonresttemplate

解决方案


试试下面的代码。您不能直接访问国家/地区,它是放置在嵌套对象中的值。而且由于响应正文作为数据返回,因此您无法将其转换为 User 对象。首先,您需要将其转换为 Data 对象。

public class User {
    private int id;
    private String name;
    private String urlPicture;
    private Address address;

    // getters and setters
}

public class Address {
    private String country;

    // getters and setters
}

public void testResponse(){
    RestTemplate restTemplate = new RestTemplate();
    Data data = new Data();
    User user = new User();
    Gson gson = new Gson();

    String response = restTemplate.getForObject(
                "https://apifrommyrequest.com/user/{id}",
                String.class,
                73442);
    data = gson.fromJson(response, Data.class);

    System.out.println(data);
}

推荐阅读