Android应用JSON反序列化失败:Spinner加载数据崩溃排查
问题分析与解决方案
首先看你的JSON结构:它本质是一个键值对集合(字典),键是交易对名称(比如"BTC_BCN"),值是对应的Data对象。但你定义的Pairs类完全不符合这个结构——你把它定义成了包含单个data属性的类,这会导致反序列化失败,pairs.data大概率是null,遍历的时候自然会崩溃。
另外还有一个小细节问题:你的Data类里的Base属性和JSON里的"base"字段名称不匹配(大小写差异),Newtonsoft.Json默认是精确匹配,所以反序列化后这个属性会是null,同样Quote和"quote"也有这个问题。
修正步骤:
修正数据模型
不需要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; } }修正反序列化代码
把反序列化的目标类型改成Dictionary<string, Data>:// 替换原来的Pairs反序列化代码 var pairsDictionary = JsonConvert.DeserializeObject<Dictionary<string, Data>>(content);正确遍历提取数据
遍历字典的每个值(也就是每个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
相关产品推荐
相关产品推荐

