Unity中如何将JSON的drones数组转换为二维int数组?
解决方案
一、当前JObject.Parse用法无问题
你现有的JSON解析逻辑本身是正确的,但要注意两个细节:
- 若JSON内容是多行结构,
reader.ReadLine()仅能读取单行,会导致解析失败,需改用ReadToEnd()或循环读取完整数据流; - 你提供的原始JSON中子数组末尾存在多余逗号(如
0.0,),部分解析器会报错,Newtonsoft.Json可自动兼容,但其他工具可能需要先清理该格式问题。
二、将drones转为二维int数组的实现方法
方法1:用Newtonsoft.Json直接反序列化(推荐)
利用你已在使用的Newtonsoft.Json库,可直接将JSON字段反序列化为目标数组,无需手动遍历:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; // ... string incoming_data = reader.ReadLine(); if(incoming_data != null) { // 方式A:直接提取drones字段反序列化 JObject json = JObject.Parse(incoming_data); int[][] dronesArray = JsonConvert.DeserializeObject<int[][]>(json["drones"].ToString()); // 方式B:定义匹配结构的类,整体反序列化 // RootObject root = JsonConvert.DeserializeObject<RootObject>(incoming_data); // int[][] dronesArray = root.drones; } // 对应方式B的根类定义 public class RootObject { public int[][] drones { get; set; } }
方法2:从JObject手动遍历转换
若需保留JObject解析流程,可通过遍历嵌套数组完成类型转换:
using Newtonsoft.Json.Linq; // ... string incoming_data = reader.ReadLine(); if(incoming_data != null) { JObject json = JObject.Parse(incoming_data); JArray dronesJArray = (JArray)json["drones"]; int[][] dronesArray = new int[dronesJArray.Count][]; for(int i = 0; i < dronesJArray.Count; i++) { JArray subArray = (JArray)dronesJArray[i]; // 将JSON中的浮点值转为int dronesArray[i] = subArray.Select(item => (int)item.Value<double>()).ToArray(); } }
三、可用的现成解析工具
- Newtonsoft.Json:即你当前使用的JObject所属库,Unity中可通过Package Manager搜索
com.unity.nuget.newtonsoft-json安装,支持复杂类型转换、格式容错,是Unity开发中最常用的第三方JSON工具; - Unity内置JsonUtility:无需额外安装,但需定义对应数据类,且对JSON格式要求更严格(需清理多余逗号),示例代码:
[System.Serializable] public class RootObject { public int[][] drones; } // 解析逻辑 string incoming_data = reader.ReadLine(); if(incoming_data != null) { RootObject root = JsonUtility.FromJson<RootObject>(incoming_data); int[][] dronesArray = root.drones; }
内容的提问来源于stack exchange,提问作者Vincent Schiller
相关产品推荐
相关产品推荐

