在Gson中,我们解析json里的固定字段非固定内容通常是通过泛型<T>封装

class Result<T>

{

public String type;

public T data;

}

这种方式我们在使用时,必须先定义泛型的类型才能去解析json字符串;

但是,实际需求中,我们可能会出现我们的请求是确认的,但是返回的字段内容是不确定的,比如说data可能是个字符串,可能是json对向,如果是用泛型,我们必须在解析之前指定类型,可是这里我们必须先解析到type才能判断data的类型,导致无法解析;

于是我尝试将data转为字符串,采用String类型来接收,根据type再来转换,这个思路肯定是没问题的,但是测试后发现,程序直接崩溃了……没错,崩了,gson不允许我们将json对象采用String来接收;

经过各种查证,发现可以使用Object来接收,emmm...  

经过debug测试发现,接收到的Json对象解析后的Object的类型为

LinkedTreeMap

使用字符串和数字解析出来类型也都是正确的,我们就可以直接使用data来转换类型使用了;

对于LinkedTreeMap我进行了toString,发现并不能转回Json字符串,看了下源码,发现它重写的toString方法


    @Override public String toString() {
      return key + "=" + value;
    }

尝试直接通过gson对data转字符串,

gson.toJson(test.data)

能获取到正确的json字符串

至此,我们可以通过Object先将未知类型的格式接收,再根据外层数据的逻辑来处理data,或者直接判断data的类型,直接进行操作,无论是直接使用LinkedTreeMap,还是转为Json再处理都可以;

之前遇到这种未知格式的解析我都是写其它解析工具来解析,这次尝试直接采用json来解析,网上搜索都说Gson只能解析固定格式,这次对Object方式解析获得了意外之喜

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐