V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fenglangjuxu
V2EX  ›  Java

请教下-解析嵌套 json

  •  
  •   fenglangjuxu · 2023-04-11 11:37:39 +08:00 · 983 次点击
    这是一个创建于 621 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己倒腾代码,发现了这个需求,请各位大神不吝赐教: 不同场景 data 的数据类型不一样,所以需要根据入参的类型 resultType,解析 json(现在的入参是 AccountingResponse 有可能别的地方入参就是 FreezingResponse) 用 hutool 的 JSONUtil 或者 fastjson

    多谢了~

    
      public static void main(String[] args) throws Exception {
    
                String jsonStr = "{\"code\":\"00000\",\"data\":{\"orderNo\":\"1681177011860111\",\"transType\":\"REAlTIME\",\"errorMessage\":\"successful\",\"errorCode\":\"00000\",\"accountingTime\":\"2023-04-11T09:36:51.879\",\"status\":\"SUCCESS\"},\"message\":\"SUCCESSFUL\"}";
                BaseResponse<AccountingResponse> response = JSON.parseObject(jsonStr, new TypeReference<BaseResponse<AccountingResponse>>(){});
                System.out.println(response.getData().getStatus());
    
    
            BaseResponse<AccountingResponse> responseBaseResponse =  gogogogo(AccountingResponse.class, jsonStr);
            System.out.println(responseBaseResponse.getData().getOrderNo());
        }
    
       
        static public <R> BaseResponse<R> gogogogo(Class<R> resultType, String jsonStr) throws Exception {
            BaseResponse<R> resultObject= null;
            resultObject = JSON.parseObject(jsonStr, new TypeReference<BaseResponse<R>>(){});
            System.out.println(resultObject.getData());
           // TypeToken<?> type1 = TypeToken.getParameterized(BaseResponse.class,resultType);
            resultObject = JSON.parseObject(jsonStr, new TypeReference<BaseResponse<R>>(){});
            //!!!!! 这里出错
            System.out.println(resultObject.getData().getOrderNo());
            return resultObject;
        }
        
    
    public class AccountingResponse implements Serializable {
    
        /**
         * 订单编号
         */
        public String orderNo;
    
        /**
         * 记账类型
         */
        public String transType;
    
        /**
         * 记账状态
         */
        public String status;
    
        public String getOrderNo() {
            return orderNo;
        }
    
        public void setOrderNo(String orderNo) {
            this.orderNo = orderNo;
        }
    
        public String getTransType() {
            return transType;
        }
    
        public void setTransType(String transType) {
            this.transType = transType;
        }
    
        public String getStatus() {
            return status;
        }
    
        public void setStatus(String status) {
            this.status = status;
        }
    }
    
    public class BaseResponse<DATA>  implements Serializable {
    
        //响应码
        private String code;
        //响应码对应的内容
        private String message;
        private DATA data;
    
        public String getCode() {
            return code;
        }
    
        public void setCode(String code) {
            this.code = code;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public DATA getData() {
            return data;
        }
    
        public void setData(DATA data) {
            this.data = data;
        }
    
    
    
        public static BaseResponse<String> success(String code, String message) {
            BaseResponse res = new BaseResponse();
            res.setCode(code);
            res.setMessage(message);
            return res;
        }
    
    
        public static BaseResponse<String> fail(String code) {
            return of(code, null);
        }
    
    
        public static BaseResponse<String> fail(String code, String message) {
            BaseResponse res = new BaseResponse();
            res.setCode(code);
            res.setMessage(message);
            return res;
        }
    
        public static <T> BaseResponse<T> of(String errCode, T data) {
            BaseResponse<T> res = new BaseResponse<T>();
            res.setCode(errCode.getCode());
            res.setMessage(errCode.getMessage());
            res.setData(data);
            return res;
        }
    
        public static <T> BaseResponse<T> of(String code, String message, T data) {
            BaseResponse<T> res = new BaseResponse<T>();
            res.setCode(code);
            res.setMessage(message);
            res.setData(data);
            return res;
        }
    
    
    }
    
    issakchill
        1
    issakchill  
       2023-04-11 14:26:22 +08:00
    fastjson 我记得可以根据某个字段反序列 支持泛型的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   980 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:57 · PVG 02:57 · LAX 10:57 · JFK 13:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.