[Unity] LitJson: 解析物件出現 System.InvalidCastException: Specified cast is not valid.

[Unity] LitJson: 解析物件出現 System.InvalidCastException: Specified cast is not valid.


2022/07/13 10:19:08

今天在寫與後端 API 串接的接口,原本用 Unity 內建的 JsonUtility 來解析 JSON 字串,但它實在太過精簡了,就連 top-level 是陣列的 JSON 都解析不出來,一定要包個 wrapper 才能用,所以我就轉而使用其他函式庫了。Newtonsoft.Json 很強大但是有點臃腫,也不太好直接放進 Unity 裡面,所以最後是選用 LitJson 這個小巧的包。

問題敘述

來上今天的 Code

[Serializable]
private class ApiResponseModel
{
public object data {get; set;}
}
ApiResponseModel resultModel = JsonMapper.ToObject<ApiResponseModel>(jsonStr);
var result = (T)resultModel.data; // ERROR!

會報出 System.InvalidCastException: Specified cast is not valid. 的錯誤

解決方法

經過研究, LitJson 似乎沒辦法「先斬後奏」,先把 Json 轉成包含 object 的 class,再把那個 object 轉回要用的型態。
所以我們要把 ApiResponseModel 換成固定型別,這裡我就換成汎型 T,如果沒有汎型需求可以直接換需要的強型別。

[Serializable]
private class ApiResponseModel<T>
{
public T data {get; set;}
}
ApiResponseModel<T> resultModel = JsonMapper.ToObject<ApiResponseModel<T>>(jsonStr);
var result = resultModel.data; // ERROR!