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

