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
相关产品推荐
相关产品推荐

