Unity3D(C#)如何从单个JSON数组拆分出按ID分组的多个JSON数组?
按指定属性分组拆分JSON对象数组(Unity C#实现)
嘿,这个需求我之前做Unity项目处理传感器数据的时候刚好碰到过,其实用C#的LINQ结合Unity的JSON解析就能很优雅地搞定,我给你一步步拆解思路和实现:
1. 先定义对应JSON结构的C#类
直接操作JSON字符串太麻烦,我们先把JSON转成强类型的C#对象。根据你给的JSON示例,定义一个带序列化特性的类:
[System.Serializable] public class LocationRecord { public int ID; public long Datetime; public string Module; public float Latitude; public float Longitude; public float Speed; }
注意:[System.Serializable]是给Unity自带的JsonUtility用的,确保字段名和JSON里的键完全一致(包括大小写),不然反序列化会丢失数据。
2. 将JSON数组反序列化为C#集合
把你的JSON字符串转成LocationRecord的数组或列表,方便后续操作:
// 假设你的原始JSON数组字符串存在jsonArrayString变量中 LocationRecord[] allRecordsArray = JsonUtility.FromJson<LocationRecord[]>(jsonArrayString); List<LocationRecord> allRecordsList = new List<LocationRecord>(allRecordsArray);
如果你用的是Newtonsoft.Json(Unity包管理器可安装),反序列化代码会更灵活,比如:
// 需要先引入Newtonsoft.Json命名空间 List<LocationRecord> allRecordsList = JsonConvert.DeserializeObject<List<LocationRecord>>(jsonArrayString);
3. 用LINQ按指定属性分组(核心步骤)
C#的LINQ提供了GroupBy方法,可以一键按指定属性分组。记得先在代码顶部引入using System.Linq;:
// 按ID分组,得到一个分组集合,每个分组的Key是ID,Value是对应ID的所有记录 var groupedRecords = allRecordsList.GroupBy(record => record.ID);
4. 转换为你需要的格式
分组后你可以把结果转成字典、数组列表等格式,方便后续使用:
- 转成字典(键为ID,值为对应记录数组):
Dictionary<int, LocationRecord[]> groupedDictionary = new Dictionary<int, LocationRecord[]>(); foreach (var group in groupedRecords) { groupedDictionary[group.Key] = group.ToArray(); }
- 转成列表的列表:
List<List<LocationRecord>> groupedLists = groupedRecords.Select(group => group.ToList()).ToList();
额外提示
- 如果要按其他属性分组,比如
Module,只需要把GroupBy的参数改成record => record.Module就行,非常灵活。 - 如果JSON里有复杂嵌套结构,Unity自带的
JsonUtility可能无法处理,这时候Newtonsoft.Json会是更好的选择。
内容的提问来源于stack exchange,提问作者Bosanac95
相关产品推荐
相关产品推荐

