【问题标题】:Transform JSON to another JSON structure将 JSON 转换为另一个 JSON 结构
【发布时间】:2020-11-17 16:25:15
【问题描述】:

我有一个案例可以将响应从 Dogs API

到这样的不同结构:

[
  {
    "breed": "pug",
    "sub_breed": []
  },
  {
    "breed": "ridgeback",
    "sub_breed": [
      {
        "breed": "rhodesian",
        "sub_breed": []
      }
    ]
  },
  {
    "breed": "doberman",
    "sub_breed": []
  },
  {
    "breed": "hound",
    "sub_breed": [
      {
        "breed": "Ibizan",
        "sub_breed": []
      },
      {
        "breed": "afghan",
        "sub_breed": []
      }
    ]
  }
]

收到回复后一头雾水,不知道怎么转换。

在收到回复之前我会这样做

    public List<DogResponse> getDogs() {
        
        List<DogResponse> response = new ArrayList<DogResponse>();
        
        try {
            
            String url = "https://dog.ceo/api/breeds/list/all";
            
            RestTemplate restTemplate = new RestTemplate();
            
            ResponseEntity<String> result = restTemplate.getForEntity(url, String.class);
            
            ObjectMapper mapper = new ObjectMapper();
            Map<String, String> map = mapper.readValue(result.getBody().toString(), Map.class);
            
            System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map.get("message")));
            
            for (Entry<String, String> entry : map.entrySet()) {
                String key = entry.getKey();
                String value = entry.getValue();
                System.out.println("key : "+key);
                System.out.println("val : "+value);
            }
            
            
        } catch (Exception e) {
            // TODO: handle exception
        }
        
        return response;
    }

狗的反应

public class DogResponse {
    
    private String breed;
    
    private DogResponse sub_breed;

    public String getBreed() {
        return breed;
    }

    public void setBreed(String breed) {
        this.breed = breed;
    }

    public DogResponse getSub_breed() {
        return sub_breed;
    }

    public void setSub_breed(DogResponse sub_breed) {
        this.sub_breed = sub_breed;
    }
    
}

我正在尝试使用 Map,但是当我想打印键和值时失败了,它什么也没显示。

【问题讨论】:

  • 也许这是一个像Dozer这样的映射框架的案例
  • 看完你的代码后,我想知道你的 DogResponse DTO 是做什么用的?在我看来,尝试将您的响应推送到 String 映射中并不好。然后你甚至可以省略 RestTemplate,做一个普通的 http 请求并自己解析 JSON。
  • 您可以从将响应映射到 List 开始。对象应改进为另一个包含字符串和字符串列表的实体

标签: java json spring spring-boot dictionary


【解决方案1】:

您应该将响应映射到 DogResponse 列表,您可能会因为循环依赖而遇到问题。

List<DogResponse> dogs = mapper.readValue(jsonString, new TypeReference<List<DogResponse>>() {});

【讨论】:

    【解决方案2】:

    你可以试试这个。

    public List<DogResponse> getDogs() {
            
           List<DogResponse> response = new ArrayList<DogResponse>();
    
        try {
    
            String url = "https://dog.ceo/api/breeds/list/all";
    
            RestTemplate restTemplate = new RestTemplate();
    
            ResponseEntity<String> result = restTemplate.getForEntity(url, String.class);
    
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Map<String, List<String>>> map = mapper.readValue(result.getBody().toString(), Map.class);
    System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map.get("message")));
              Map<String, List<String>> innerMap = map.get("message");
    
              for (Entry<String, List<String>> entry : innerMap.entrySet()) {
                  String key = entry.getKey();
                  List<String> value = entry.getValue();
                  System.out.println("key : " + key);
                  System.out.println("val : " + value);
              }
    
          } catch (Exception e) {
            // TODO: handle exception
          }
            
            return response;
        }
    

    【讨论】:

      【解决方案3】:

      ResponseEntity 结果 = restTemplate.getForEntity(url, DogResponse.class);

      这应该可行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-27
        • 2017-03-21
        • 1970-01-01
        • 1970-01-01
        • 2018-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多