在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方式解析獲得了意外之喜