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

Android应用JSON反序列化失败:Spinner加载数据崩溃排查

问题分析与解决方案

首先看你的JSON结构:它本质是一个键值对集合(字典),键是交易对名称(比如"BTC_BCN"),值是对应的Data对象。但你定义的Pairs类完全不符合这个结构——你把它定义成了包含单个data属性的类,这会导致反序列化失败,pairs.data大概率是null,遍历的时候自然会崩溃。

另外还有一个小细节问题:你的Data类里的Base属性和JSON里的"base"字段名称不匹配(大小写差异),Newtonsoft.Json默认是精确匹配,所以反序列化后这个属性会是null,同样Quote和"quote"也有这个问题。

修正步骤:

  1. 修正数据模型
    不需要Pairs类,直接用Dictionary<string, Data>来匹配JSON的字典结构,同时给Data类的属性加上JsonProperty特性来匹配JSON字段名:

    public class Data 
    { 
        public int id { get; set; } 
        public int baseID { get; set; } 
        public int quoteID { get; set; } 
        [JsonProperty("base")]
        public string Base { get; set; } 
        [JsonProperty("quote")]
        public string Quote { get; set; } 
        public string currencyPair { get; set; } 
    }
    
  2. 修正反序列化代码
    把反序列化的目标类型改成Dictionary<string, Data>:

    // 替换原来的Pairs反序列化代码
    var pairsDictionary = JsonConvert.DeserializeObject<Dictionary<string, Data>>(content);
    
  3. 正确遍历提取数据
    遍历字典的每个值(也就是每个Data对象),提取currencyPair:

    List<string> spinnerItems = new List<string>();
    foreach (var pairEntry in pairsDictionary)
    {
        // pairEntry.Value就是对应的Data对象
        spinnerItems.Add(pairEntry.Value.currencyPair);
    }
    spinnerItems.Sort();
    // 剩下的Adapter代码不变
    adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleSpinnerDropDownItem, spinnerItems);
    spinner2.Adapter = adapter;
    

为什么原来的代码会崩溃?

  • 因为JsonConvert.DeserializeObject<Pairs>(content)无法正确解析JSON结构,pairs.data会是null,当你尝试访问pairs.data.currencyPair时就会抛出NullReferenceException,导致应用崩溃。
  • 就算假设反序列化成功了,currencyPair是一个字符串,你用foreach (var k in pairs.data.currencyPair)遍历的是字符串的每个字符,而不是交易对列表,这也不是你想要的结果。

把这些修正点都改完后,应该就能正常把交易对填充到Spinner里了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:21:35