You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 09:54:18