解析JSON文件报错: ArgumentException: JSON must represent an object type.
问题原因:Unity中JsonUtility
不直接支持JSON数组,仅支持JSON文件格式
数据组的格式如下
[
{
"name": "Object1",
"x": 10.5,
"y": 20.3
},
{
"name": "Object2",
"x": 15.2,
"y": 25.7
},
{
"name": "Object3",
"x": 8.7,
"y": 18.9
}
]
JSON文件的内容类似于:
{
"objectDetails": [
{
"name": "Object1",
"x": 10.5,
"y": 20.3
},
{
"name": "Object2",
"x": 15.2,
"y": 25.7
},
{
"name": "Object3",
"x": 8.7,
"y": 18.9
}
]
}
解决方法:
- 使用
JsonHelper
类来解析JSON数组。因为Unity的JsonUtility
不直接支持JSON数组,所以我们需要这个辅助类。
创建一个将JSON数组快速包装成JSON文件的方法JsonHelper
/// <summary>
/// JSON快速包装方法
/// </summary>
public static class JsonHelper
{
public static T[] FromJson<T>(string json)
{
string newJson = "{ \"array\": " + json + "}";
Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(newJson);
return wrapper.array;
}
[System.Serializable]
private class Wrapper<T>
{
public T[] array;
}
}
使用 JsonHelper包装JSON文件并解析文件
/// <summary>
/// 解析接收到的数据
/// </summary>
/// <param name="jsonData"></param>
void ProcessData(string jsonData)
{
//List<ObjectInfo> objects = new List<ObjectInfo>();
// 解析JSON数据
var objectDetails = JsonHelper.FromJson<ObjectDetail>(jsonData);
foreach (var detail in objectDetails)
{
//Debug.Log($"Name: {detail.name}, X: {detail.x}, Y: {detail.y}");
string Name = detail.name;
float X = detail.x;
float Y = detail.y;
objects.Add(new ObjectInfo(Name, X, Y));
//Debug.Log($"Name: {detail.name}, X: {detail.x}, Y: {detail.y}");
射线投射并转换为世界坐标
//CastRayAndAddToGlobalList(name, new Vector2(newX, newY));
}
//CreateObjectsFromData();
}