Fastjson解析多级泛型的⼏种⽅式—新增使⽤class⽂件来解析多级泛型
Fastjson解析多级泛型
前⾔
现在⽹上⼤多数是使⽤TypeReference ⽅式来解析JSON数据,这⾥我提供另外⼀种⽅式来解析,使⽤类⽂件进⾏解析,两种⽅式我都会给出实际代码
实例
TypeReference⽅式
@GET
@Path("getUserCourse")
@Produces(MediaType.APPLICATION_JSON)
public Result<List<UserCourseDto>> getUserCourse(){
UserCourse();
}
public Result<List<UserCourseDto>> getUserCourse(){
String result = ForObject(MOCK_JSON_URL, String.class);
return JSONObject.parseObject(result, new TypeReference<Result<List<UserCourseDto>>>() {});
}
可以得到json返回的结果
{
status: 0,
message: "1",
data: [
{
openType: "兑换 ",
userID: 30014,
classID: 10376,
className: "趣味职场俚语课程【11⽉班】",
chargeFee: 106,
classStudyTime: null,
openRMB: 0,
rechargeFee: 0,
awardFee: 0,
openFee: 0,
dateAdded: 1312175789393,
expiredDate: 1323964800000
}
]
}
介绍:
这⾥使⽤了提供的TypeReference进⾏包装,能够清晰明了进⾏解析多级泛型,但是有时候,我们做⼀些通⽤的解析框架的时候,可能会⽤T类型,T类型拿到的是字节码⽂件,或者class对象,⼜该怎么处理呢?请看下⾯介绍。
class类⽅式
接⼝:
接⼝之类⽤了⼀个注解来处理的,没有直接传class对象过去,因为在实际项⽬中,基本都是注解,没有谁会直接传class对象。所以我传的Annotation数组过去啦
@GET
@Reader(extParamClass = {Result.class,List.class,UserCourseDto.class})
@Path("getUserCourseV2")
@Produces(MediaType.APPLICATION_JSON)
public Result<List<UserCourseDto>> getUserCourseV2(){
Annotation[] annotations = new Annotation[0];
for (Method method : Class().getMethods()) {
if (Name().equals("getUserCourseV2")){
annotations = Annotations();
}
}
UserCourseV2(annotations);
}
处理:
public Result<List<UserCourseDto>> getUserCourseV2(Annotation[] annotations) {
final Reader[] readers = {null};
if(annotations != null) {
Arrays
.stream(annotations)
.filter(annotation -> annotation.annotationType().equals(Reader.class))
.findFirst().ifPresent(x -> readers[0] = (Reader) x);
}
Class[] classes = readers[0].extParamClass();
String result = ForObject(MOCK_JSON_URL, String.class);
//这⾥不⽤TypeReference⽅式,直接⽤class对象来处理
ParameterizedTypeImpl beforeType = null;
if (classes.length!=0){
//⽀持多级泛型的解析
fastjson怎么用for (int i = classes.length-1; i >0 ; i--) {
beforeType = new ParameterizedTypeImpl(new Type[]{beforeType == null? classes[i]:beforeType}, null, classes[i - 1]);
}
}
return  JSON.parseObject(result,beforeType);
}
代码评析:
主要起作⽤的还是这两⾏代码
for (int i = classes.length-1; i >0 ; i--) {
beforeType = new ParameterizedTypeImpl(new Type[]{beforeType == null? classes[i]:beforeType}, null, classes[i - 1]);
}
主要意思是将你的class对象包装成⼀个ParameterizedTypeImpl,使⽤ParameterizedTypeImpl来解析多级泛型,但是要注意的是,每层泛型,都需要⽤⼀个ParameterizedTypeImpl对象进⾏包装起来才会起作⽤,因为他会有⼀个actualTypeArguments 和⼀个 rawType ,在多级泛型中,⽤我这⾥的例⼦说明,第⼀层的时候rawType 会是⼀个Result对象,⽽actualTypeArguments 会是⼀个包装过后
的ParameterizedTypeImpl对象,第⼆层的时候,rawType 会是⼀个List对象,⽽actualTypeArguments 会是包装上⼀层的对象。后同。PS :如果这⾥不知道我说的是什么,请调试的时候结合来看哈
最后也可以正确解析哈~
END

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。