• 解析Health端点数据获取异常数据


    问题:

      由于健康节点响应类型是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());
        }
    }
  • 相关阅读:
    Java IO/NIO
    LeetCode—— 两两交换链表中的节点
    LeetCode——合并K个排序链表
    LeetCode第201场周赛
    LeetCode第202场周赛
    LeetCode215. 数组中的第K个最大元素
    LeetCode213. 打家劫舍 II
    LeetCode212. 单词搜索 II
    LeetCode211. 添加与搜索单词
    LeetCode210. 课程表 II
  • 原文地址:https://www.cnblogs.com/atliwen/p/10944526.html
Copyright © 2020-2023  润新知