Xamarin(C#)中JSON反序列化继承类适配分组ListView崩溃问题求解
问题核心原因
- 你提供的JSON示例存在两处语法错误:
- 第一条分组内nom为B的条目,
numero字段值多了一个前置双引号:""0600000001"应改为"0600000001" - 第二条分组内nom为E的条目,前一行末尾缺少逗号分隔
- 第一条分组内nom为B的条目,
- 继承
List<T>的自定义类无法被Newtonsoft.Json正常反序列化:Json.NET默认将继承自集合类型的类当做集合处理,只会解析数组结构填充集合,不会读取类自身的nomCategorie属性,也不会处理你自定义的liste字段映射。
解决步骤
步骤1:修正JSON语法
修正后合法JSON示例如下:
[ { "nomCategorie": "1", "liste": [ { "nom": "A", "numero": "0600000000" }, { "nom": "B", "numero": "0600000001" }, { "nom": "C", "numero": "0600000002" } ] }, { "nomCategorie": "2", "liste": [ { "nom": "D", "numero": "0600000003" }, { "nom": "E", "numero": "0600000004" } ] } ]
步骤2:调整自定义类结构
放弃继承List<T>的写法,改用组合模式实现分组适配,同时实现IEnumerable<AnnuaireTelephonique>接口满足Xamarin分组ListView的要求,这种写法完全匹配你的JSON结构,反序列化不会丢失属性:
public class AnnuaireTelephonique { public string nom { get; set; } public string numero { get; set; } } public class RootAnnuaireTelephonique : IEnumerable<AnnuaireTelephonique> { public string nomCategorie { get; set; } public List<AnnuaireTelephonique> liste { get; set; } // 实现IEnumerable接口满足ListView分组要求 public IEnumerator<AnnuaireTelephonique> GetEnumerator() { return liste.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }
可选兼容方案:如果你坚持要保留继承
List<T>的写法,可以给类加上[JsonObject]特性强制Json.NET当做对象反序列化,然后手动把liste属性的内容添加到集合中:[JsonObject] public class RootAnnuaireTelephonique : List<AnnuaireTelephonique> { public string nomCategorie { get; set; } public List<AnnuaireTelephonique> liste { get => this; set => AddRange(value); } }这种写法兼容性不如组合模式,更推荐使用前者。
步骤3:调整反序列化逻辑
修改后你的原有反序列化代码不需要做逻辑改动,补充ListView绑定即可:
var annuaireTelephoniqueJson = JsonConvert.DeserializeObject<List<RootAnnuaireTelephonique>>(ReadData(annuaireTelephoniqueFileName)); AnnuaireTelephonique = new ObservableCollection<RootAnnuaireTelephonique>(annuaireTelephoniqueJson); // 绑定到ListView listData.ItemsSource = AnnuaireTelephonique;
步骤4:ListView绑定无需修改
你现有的XAML代码已经适配了新的类结构,GroupHeaderTemplate绑定nomCategorie、ItemTemplate绑定子项的nom和numero都可以正常生效。
内容的提问来源于stack exchange,提问作者Rtinox
相关产品推荐
相关产品推荐

