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

Xamarin(C#)中JSON反序列化继承类适配分组ListView崩溃问题求解

问题核心原因
  1. 你提供的JSON示例存在两处语法错误:
    • 第一条分组内nom为B的条目,numero字段值多了一个前置双引号:""0600000001"应改为"0600000001"
    • 第二条分组内nom为E的条目,前一行末尾缺少逗号分隔
  2. 继承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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:15:05