【好记性不如烂笔头】记一次线上事故,json单对象转换和集合转换的动态实现

项目场景:

有一组数据前后端交互通过json实现的,之后有业务需要批量传输数据,前端大佬对数据做了处理,最终传输过来的json有两种情况:集合方式、单对象方式


问题描述`

前端大佬给过来的json格式是不定的,导致没法固定写法去转换json对象,虽然try-catch也能实现,但是太low了。
在这里插入图片描述


解决方案:

本打算自己手写一个判断是否是array的接口,但后来发现糊涂工具包已经写好了,我就不重复写了

  1. 识别一下json的格式
  2. 按照不同的格式走不同的转换逻辑
     public static List<?> getAs(String json,Class<?> c) {
        List<?> reqDTOs = new ArrayList<>();
        if (json != null) {
            if (cn.hutool.json.JSONUtil.isJsonArray(json)) {
                System.out.println("json is array");
                reqDTOs = cn.hutool.json.JSONUtil.parseArray(json).toList(c);
            } else if (cn.hutool.json.JSONUtil.isJson(json)) {
                System.out.println("json is not array");
                reqDTOs.add(cn.hutool.json.JSONUtil.parseObj(json).toBean((Type) c));
            }
        }
        return reqDTOs;
    }

测试代码:

import lombok.Getter;
import lombok.Setter;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Classname Test
 * @Description TODO
 * @Version 1.0.0
 * @Date 27/9/2022 下午5:53
 * @Created by 24534
 */
public class Test {
    public static void main(String[] args) {
        A a = new A();
        a.setC1("1");
        a.setC2(1);
        a.setC3(new Date());
        a.setC4(true);
        a.setC5(new B());
        B b = new B();
        b.setB1("1");
        b.setB2(2);
        a.setC6(new ArrayList<B>() {{
            add(b);
        }});
        String json = cn.hutool.json.JSONUtil.toJsonStr(a);
        System.out.println("jsonStr:" + json);
        List<A> reqDTOs = (List<A>) getAs(json, A.class);
        reqDTOs.forEach(t -> System.out.println(t));
        System.out.println("==========================");
        A c = new A();
        List<A> cl = new ArrayList<>();
        cl.add(a);
        cl.add(c);
        json = cn.hutool.json.JSONUtil.toJsonStr(cl);
        System.out.println("jsonStr:" + json);
        reqDTOs = (List<A>) getAs(json, A.class);
        reqDTOs.forEach(t -> System.out.println(t));
    }

    public static List<?> getAs(String json,Class<?> c) {
        List<?> reqDTOs = new ArrayList<>();
        if (json != null) {
            if (cn.hutool.json.JSONUtil.isJsonArray(json)) {
                System.out.println("json is array");
                reqDTOs = cn.hutool.json.JSONUtil.parseArray(json).toList(c);
            } else if (cn.hutool.json.JSONUtil.isJson(json)) {
                System.out.println("json is not array");
                reqDTOs.add(cn.hutool.json.JSONUtil.parseObj(json).toBean((Type) c));
            }
        }
        return reqDTOs;
    }

    @Getter
    @Setter
    static class A{
        private String c1;

        private Integer c2;

        private Date c3;

        private Boolean c4;

        private B c5;

        private List<B> c6;

        @Override
        public String toString() {
            return "A{" +
                    "c1='" + c1 + '\'' +
                    ", c2=" + c2 +
                    ", c3=" + c3 +
                    ", c4=" + c4 +
                    ", c5=" + c5 +
                    ", c6=" + c6 +
                    '}';
        }
    }

    @Getter
    @Setter
    static class B {

        private String b1;

        private Integer b2;

        @Override
        public String toString() {
            return "B{" +
                    "b1='" + b1 + '\'' +
                    ", b2=" + b2 +
                    '}';
        }
    }
}

测试结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泪梦殇雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值