android 动态解析,Android中动态解析Json

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

Android APP与服务器数据的交互离不开json,看看下面一些比较聪明的解析服务器传回数据的方法。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43public class implements Serializable{

private String status;

private int count;

private T data;

private String message;

public String getStatus(){

return status;

}

public void setStatus(String status){

this.status = status;

}

public int getCount(){

return count;

}

public void setCount(int count){

this.count = count;

}

public T getData(){

return data;

}

public void setData(T data){

this.data = data;

}

public String getMessage(){

return message;

}

public void setMessage(String message){

this.message = message;

}

}

这是一个用于接收服务器传回的Json的通用范型实体类,我的思路是在每个需要进行网络解析的地方传入不同的范型,利用FastJson对不同的网路请求结果进行一次解析,大致代码如下:1

2

3String response = new String(responseBody);

Result result = JSON.parseObject(response, new TypeReference>() {

});

虽然美好的愿望实现了,但是并没有持续多久,没有几次它就出错了。而且问题很奇葩,主要原因是传范型引起的,我在FastJson的GitHub的Issue中也发现了这个问题,但是作者并没有给出结果。

google了很久并未解决,项目催的又紧,只好尝试使用Gson尝试,居然没这问题,然后这个问题就这么混过去了。

之后空下来了,想通过二次解析来实现之前利用FastJson一次解析出现的问题。其实就是将之前出错的data部分当成Json字符串,这样当status异常的时候就无需解析了,也节省了不必要的操作。

ParameterizedType

Type直接子接口;

ParameterizedType,GenericArrayType,TypeVariable和WildcardType四种类型的接口ParameterizedType: 表示一种参数化的类型,比如Collection

GenericArrayType: 表示一种元素类型是参数化类型或者类型变量的数组类型

TypeVariable: 是各种类型变量的公共父接口

WildcardType: 代表一种通配符类型表达式,比如?, ? extends Number, ? super Integer【wildcard是一个单词:就是“通配符”】

ParameterizedType接口类型的含义:表示参数化类型<>中的实际类型。

源码声明:Type[] getActualTypeArguments();

【注意】无论<>中有几层<>嵌套,这个方法仅仅脱去最外层的<>之后剩下的内容就作为这个方法的返回值。

实现过程

在某个场景的基类中传入范型的参数T

例如:1

2

3

4

5public sabstract BaseRecycleListFragment{

...

}

在基类的网络数据的回调方法中进行二次解析

例如:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15Result result = JSON.parseObject(responseBody,Result.class);

if(result!=null && result.getStatus().equals("ok"))

Type type = BaseRecycleListFragment.this.getClass().getGenericSuperclass();

if(type instanceof ParameterizedType){

Type poClass = (ParameterizedType).getActualTypeArguments()[0];

if(poClass!=null){

List data = JSON.parseArray(JSON.toJSONString(result.getData()),(Class poClass));

...

...

...

}

}

上面的代码就是一个二次解析一个列表的例子,首先判断status是否正确,正确的话进行二次解析。

这样就避免了1次解析出错的情况了。

其他

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值