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

Unity如何读取含嵌套对象数组的JSON数据 解决values读取为0问题

问题核心原因
  • 所有参与序列化的自定义类必须添加[Serializable]特性,否则Unity内置的JsonUtility无法识别类字段
  • 你定义的Card类缺失与JSON结构匹配的嵌套字段(values、effectTexts等属性都没在Card里声明)
  • 你脚本中声明的public Values values是独立的全局变量,没有和解析出来的Card对象关联,自然读取不到JSON里的数值
正确实现步骤

1. 补全序列化类结构

using System;

// 所有自定义序列化类都加[Serializable]
[Serializable]
public class Cards
{
    public Card[] cards;
}

[Serializable]
public class Card
{
    public string id;
    public string type;
    public string name;
    public int amountInDeck;
    // 补全和JSON对应的嵌套字段,注意字段名和JSON完全一致,类型对应数组
    public Values[] values;
    public EffectText[] effectTexts;
    public FlavorText[] flavorTexts;
    public StaysOnField[] staysOnField;
}

[Serializable]
public class Values
{
    public int civilian;
    public int fiend;
}

[Serializable]
public class EffectText
{
    public string civilian;
    public string fiend;
}

[Serializable]
public class FlavorText
{
    public string civilian;
    public string fiend;
}

[Serializable]
public class StaysOnField
{
    public bool civilian;
    public bool fiend;
}

2. 修改解析逻辑

using UnityEngine;

public class CardEffects : MonoBehaviour
{
    public TextAsset jsonFile;

    void Start()
    {
        Cards cardsInJson = JsonUtility.FromJson<Cards>(jsonFile.text);

        foreach (Card card in cardsInJson.cards)
        {
            // 从当前card对象的values数组取第一个元素的civilian值
            Debug.Log("Card name: " + card.name + "  civilian数值: " + card.values[0].civilian);
            // 其他字段同理,比如取fiend的效果文本:
            Debug.Log("Fiend效果: " + card.effectTexts[0].fiend);
        }
    }
}

优化建议

你当前JSON里的values、effectTexts等数组永远只有1个元素的话,可以直接把JSON结构里的数组改成单个对象,不用包一层数组,代码里字段也可以从数组改成单个对象,不用每次都加[0]取值,逻辑更简洁:
比如JSON调整后:

{
  "cards": [
    {
      "id": "sand_bags",
      "type": "Structure",
      "name": "Sand Bags",
      "values": {
        "civilian": 1,
        "fiend": -1
      },
      // 其他字段同理去掉外层[]
      "amountInDeck": 5
    }
  ]
}

对应的Card类里的字段就可以改成public Values values;,不需要用数组类型。
如果之后需要处理更复杂的JSON结构(比如字典、嵌套层级更深),可以用Unity官方集成的Newtonsoft Json库,在Package Manager里搜索安装即可,兼容性和功能比内置JsonUtility更强。

内容的提问来源于stack exchange,提问作者QuazArxx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:45:04