问题:
由于健康节点响应类型是Health类,并且由于需要执行的健康状态类不固定,返回的类型数据的字段不是固定的,所以使用了@JsonAngGetter 注解,照成了解析这个JSON 结构非常不方便。
目标:
解析不太规范的Json数据结构,只获取异常描述信息。
解决方式:
如下示例
package com.zjs.password.health; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; import java.util.HashMap; import java.util.Map; /** * @author 李文 * @create 2019-05-29 15:53 **/ public class jsonTest { @Data public static class HealthResponse { private String status; private Map<String, HealthData> other = new HashMap<>(); public String getStatus() { return status; } public HealthResponse setStatus(String status) { this.status = status; return this; } @JsonAnyGetter public Map<String, HealthData> getOther() { return other; } @JsonAnySetter public void setOther(String key, HealthData value) { this.other.put(key, value); } } @Data @JsonIgnoreProperties(ignoreUnknown = true) public static class HealthData { String status; String error; } public static void main(String[] args) throws Exception { ObjectMapper o = new ObjectMapper(); String sad = "{\"status\":\"DOWN\",\"custom\":{\"status\":\"UP\"},\"test\":{\"status\":\"UP\"},\"rabbit\":{\"status\":\"UP\",\"version\":\"3.7.7\"},\"db\":{\"status\":\"DOWN\",\"error\":\"MySQL****\"},\"hystrix\":{\"status\":\"UP\"}}"; HealthResponse healthResponse = o.readValue(sad, HealthResponse.class); StringBuilder builder=new StringBuilder(8); if (!"UP".equals(healthResponse.getStatus())) { for (Map.Entry<String, HealthData> s : healthResponse.getOther().entrySet()) { if (!"UP".equals(s.getValue().getStatus())) { builder.append(s.getKey()).append(" : ").append(s.getValue().getError()).append(" "); } } } System.out.println(builder.toString()); System.out.println(healthResponse.toString()); } }
原文:https://www.cnblogs.com/atliwen/p/10944526.html