项目场景:
有一组数据前后端交互通过json实现的,之后有业务需要批量传输数据,前端大佬对数据做了处理,最终传输过来的json有两种情况:集合方式、单对象方式
问题描述`
前端大佬给过来的json格式是不定的,导致没法固定写法去转换json对象,虽然try-catch也能实现,但是太low了。
解决方案:
本打算自己手写一个判断是否是array的接口,但后来发现糊涂工具包已经写好了,我就不重复写了
- 识别一下json的格式
- 按照不同的格式走不同的转换逻辑
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 +
'}';
}
}
}
测试结果