Unity中C#反序列化JSON嵌套数组并获取属性方法
解决方案与代码优化建议
一、实现card.image_url的简洁访问
要直接通过card.image_url获取嵌套图片链接,只需在Card类中新增一个只读计算属性,自动从card_images数组中提取第一个元素的image_url,同时做空值避免异常:
public class Card { public int id { get; set; } public string name { get; set; } public string desc{ get; set; } public CardImage[] card_images { get; set; } // 新增只读属性,直接返回第一张卡图的链接 public string image_url { get { // 空值检查:避免数组为空/Null时抛出异常 if (card_images == null || card_images.Length == 0) return string.Empty; return card_images[0].image_url; } } }
修改后即可在Start方法中直接调用:
foreach(Card card in cards.data) { Debug.Log(card.name); Debug.Log(card.desc); Debug.Log(card.image_url); // 现在可以直接访问图片链接 }
二、OOP与代码规范建议(针对新手)
1. 遵循C#命名规范
C#行业标准使用**帕斯卡命名法(PascalCase)**给类、属性命名,提升代码可读性,修改后的类示例:
public class Root { public Card[] Data { get; set; } } public class Card { public int Id { get; set; } public string Name { get; set; } public string Desc { get; set; } public CardImage[] CardImages { get; set; } public string ImageUrl { get { if (CardImages == null || CardImages.Length == 0) return string.Empty; return CardImages[0].ImageUrl; } } } public class CardImage { public int Id { get; set; } public string ImageUrl { get; set; } public string ImageUrlSmall { get; set; } }
注:如果使用Unity自带的
JsonUtility反序列化,需通过[JsonProperty("原JSON键名")]特性映射命名,例如[JsonProperty("card_images")] public CardImage[] CardImages { get; set; }
2. 强制空值安全检查
永远不要假设API返回的数组/对象一定非空,比如card_images可能为空数组或Null,直接访问card_images[0]会抛出空引用异常,必须提前判断。
3. 优先使用Unity自带工具
Unity自带的JsonUtility足够处理大部分JSON场景,无需自定义JsonHelper,使用示例:
string jsonString = File.ReadAllText("myTxtJson.txt"); Root root = JsonUtility.FromJson<Root>(jsonString); foreach(Card card in root.Data) { // 逻辑代码 }
4. 强化封装思想
通过计算属性暴露图片链接,而非让外部直接访问card_images数组。后续如果API返回的图片结构变化(比如从数组改为单个对象),只需修改Card类的ImageUrl属性实现,外部代码无需改动,符合开闭原则。
内容的提问来源于stack exchange,提问作者BriqueDeJus
相关产品推荐
相关产品推荐

