如何从API返回的嵌套JSON中提取数据并存储为列表?
问题:提取API返回的嵌套JSON数据到列表中
我调用API后返回的数据结构如下:
"info": { "id": 15, "status": "on-going", "user_id": 10, "data": "[{\"position\":\"{\\\"X\\\":\\\"3\\\",\\\"Y\\\":\\\"56\\\",\\\"Z\\\":\\\"90\\\"}\",\"status\":\"not-found\"},{\"position\":\"{\\\"X\\\":\\\"9\\\",\\\"Y\\\":\\\"46\\\",\\\"Z\\\":\\\"45\\\"}\",\"status\":\"not-found\"},{\"position\":\"{\\\"x\\\":90,\\\"Y\\\":4,\\\"Z\\\",\\\"44\\\"}\",\"status\":\"not-found\"},{\"position\":\"{\\\"x\\\":80,\\\"Y\\\":10,\\\"Z\\\",\\\"0\\\"}\",\"status\":\"not-found\"}]" }
我需要把data字段的值提取为列表,分别存储成两个列表:
- position列表:每个元素格式为
X:3,Y:56,Z:90 - status列表:每个元素为
not-found这类状态值
后续通过索引关联对应的数据。目前我的调用代码如下:
if (cd.result.ToString() != "no data") { createResponse = JsonUtility.FromJson<CreateResponse>(cd.result.ToString()); string str = createResponse.game.data.ToString(); } [Serializable] public class Game { public string id; public string status; public string data; public string user_id; }
请指导如何实现数据提取与存储需求。
解决方案
1. 定义对应的数据模型
由于data字段是嵌套的JSON字符串,需要补充定义能解析它的序列化类:
[Serializable] public class Game { public int id; // 原数据是数字类型,用int比string更合适 public string status; public string data; public int user_id; // 同理用int匹配原数据类型 } [Serializable] public class PositionItem { public string position; public string status; } [Serializable] public class PositionCoords { // 兼容返回数据中X/x的大小写差异 public string X; public string x; public string Y; public string Z; } // 辅助类:解决Unity JsonUtility无法直接反序列化顶级数组的问题 [Serializable] public class ListWrapper<T> { public List<T> items; }
2. 解析嵌套JSON并提取数据
在原有代码基础上,添加完整的解析逻辑,将data字符串转换为目标列表:
if (cd.result.ToString() != "no data") { createResponse = JsonUtility.FromJson<CreateResponse>(cd.result.ToString()); // 1. 将data字段的JSON字符串反序列化为PositionItem列表 List<PositionItem> positionItems = JsonUtility.FromJson<ListWrapper<PositionItem>>($"{{\"items\":{createResponse.game.data}}}").items; // 2. 初始化两个目标列表 List<string> positionList = new List<string>(); List<string> statusList = new List<string>(); // 3. 遍历解析后的列表,提取并格式化数据 foreach (var item in positionItems) { // 解析position字段内的坐标JSON PositionCoords coords = JsonUtility.FromJson<PositionCoords>(item.position); // 处理X/x的兼容:优先取大写X,无值则用小写x string xValue = !string.IsNullOrEmpty(coords.X) ? coords.X : coords.x; // 拼接成指定格式的字符串 string positionStr = $"X:{xValue},Y:{coords.Y},Z:{coords.Z}"; positionList.Add(positionStr); statusList.Add(item.status); } // 后续可通过索引关联数据,比如positionList[0]对应statusList[0] }
关键说明
- Unity的
JsonUtility不支持直接反序列化顶级数组,因此用ListWrapper类做一层包装来适配 - 针对返回数据中坐标字段的大小写问题,通过同时定义
X和x字段,解析时优先取大写值保证兼容性 - 最终
positionList和statusList的索引完全对应,可直接通过索引关联同一组数据
内容的提问来源于stack exchange,提问作者user2395639
相关产品推荐
相关产品推荐

