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

Xamarin中用Newtonsoft反序列化含任意整数键JSON遇空引用异常

解决Xamarin中Newtonsoft.Json反序列化整数键字典的空引用问题

你遇到的问题主要有两个核心点:反序列化时选错了根对象类型,以及没有处理可能的空引用场景。让我一步步帮你梳理解决:

1. 修正反序列化的目标类型

你的JSON根结构是包含ok和payment-methods的PaymentOptions对象,但你现在错误地把它反序列化成了PaymentMethods——这直接导致后续访问deserializedGetPaymentOptions.Options时触发空引用异常,因为这个对象根本不是正确的根实例!

把反序列化代码改成这样:

var jsonContent = await responseGetPaymentOptions.Content.ReadAsStringAsync();
var deserializedOptions = JsonConvert.DeserializeObject<Models.PaymentOptions>(jsonContent);

2. 处理字典遍历的空引用防护

即使修正了类型,仍要注意PaymentMethods列表中的项可能存在Options为null,或者Issuers字典为null的情况,直接遍历会再次触发异常。推荐两种处理方式:

方式一:在模型中提前初始化集合

修改模型定义,提前初始化列表和字典,从根源避免null:

[JsonObject(MemberSerialization.OptIn)]
public class PaymentOptions
{
    [JsonProperty("ok")]
    public Boolean OK { get; set; }
    
    [JsonProperty("payment-methods")]
    // 初始化列表,避免null
    public List<PaymentMethods> PaymentMethods { get; set; } = new List<PaymentMethods>();
}

public class PaymentMethods
{
    [JsonProperty("id")]
    public string Id { get; set; }
    
    [JsonProperty("type")]
    public string Type { get; set; }
    
    [JsonProperty("options")]
    // 初始化Options对象
    public Options Options { get; set; } = new Options();
}

public class Options
{
    [JsonProperty("issuers")]
    // 初始化字典,避免null
    public IDictionary<int, string> Issuers { get; set; } = new Dictionary<int, string>();
}

方式二:遍历前添加空值判断

如果不想修改模型初始化逻辑,就在遍历时逐层检查空值:

// 先遍历PaymentMethods列表
foreach (var paymentMethod in deserializedOptions.PaymentMethods)
{
    // 逐层检查Options和Issuers是否不为null
    if (paymentMethod?.Options?.Issuers != null)
    {
        foreach (KeyValuePair<int, string> issuerFromDict in paymentMethod.Options.Issuers)
        {
            // 处理你的issuer数据,比如获取"Test Issuer"
            var issuerName = issuerFromDict.Value;
            // 后续业务逻辑...
        }
    }
}

3. 验证JSON格式(可选)

另外你提供的JSON末尾多了一个多余的逗号:}, },这可能导致反序列化失败。确保接口返回的是合法JSON,正确格式应为:

{ 
    "ok": true, 
    "payment-methods": [ 
        { 
            "id": "39sahf92ka9s02", 
            "type": "ideal", 
            "options": { 
                "issuers": { 99: "Test Issuer" } 
            } 
        } 
    ]
}

调整后你就能正常获取到Issuers字典里的"Test Issuer"了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:19:56