JsonUtility无法解析json数组,也无法将数组正确转换为json,之前一直是把每个数组做成对象在转换,但是前端使用起来感觉不方便,后来经过搜索查询,感觉这个方案靠谱。
首先是创建一个泛型类:
[Serializable]
public class Wrapper<T>
{
public T[] items;
}
当Unity需要将数组作为参数传递到页面上的时候,实际上是先将该数组包裹到一个Wrapper对象内,
void OnSetFixedNodeList(TranNode[] tranNodes)
{
if (Application.platform != RuntimePlatform.WebGLPlayer) return;
//
if (tranNodes == null || tranNodes.Length == 0) return;
string[] names = new string[tranNodes.Length];
for (int i = 0; i < names.Length; i++)
{
names[i] = tranNodes[i].name;
}
Wrapper<string> wrapper = new Wrapper<string>();
wrapper.items = names;
WebUpdateFixedNodeList(JsonUtility.ToJson(wrapper));
}
页面上得到的是一个包裹了数组的json对象,页面对该json对象进行解析,获得数组,类似下面这样:
var fixedNodeList;
function UpdateFixedNodeList(nodeList)
{
var obj = JSON.parse(nodeList); fixedNodeList = obj.items;
console.log(fixedNodeList);
}
当页面需要向unity发送消息的时候,也应该先把数组包裹成一个json对象,像下面这样包裹一个名称为param的数组:
function SendMsgWithJsonArray(funName, param)
{
if(myGameInstance != null)
{
myGameInstance.SendMessage('_InternalObj', funName, JSON.stringify({"items":param}));
}
}
当Unity接收到这样一个接送对象的时候,先把这个json转成对象,再提取其中的数组,类似这样:
static public void JsonArray<T>(string json, UnityAction<T[]> act)
{
Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
if (wrapper != null)
{
act?.Invoke(wrapper.items);
}
else
{
string tName = wrapper.GetType().Name;
Debug.Log("U3DLog:ParseExecute.JsonArray<" + tName + "> failed,because can NOT parse " + json + ".");
}
}