C#反序列化JSON数组报错:无法展示州与城市列表的解决求助
问题解决方法
错误根源
你的JSON是数组结构(外层由[]包裹,包含多个州对象),但代码中尝试将其反序列化为单个Dictionary<string, object>对象,类型不匹配导致反序列化失败。
修复步骤
1. 定义实体类(可选但更规范)
先定义对应JSON结构的实体类,让数据操作更清晰:
public class StateCityModel { public string State { get; set; } public List<string> City { get; set; } }
2. 正确反序列化JSON数组
将整个JSON数组反序列化为实体列表(注意原代码中stateCities是空列表,需替换为实际的JSON字符串):
// 替换为你的实际JSON内容 string jsonData = @"[ { ""State"": ""California"", ""City"": [""Los Angeles"", ""San Diego"", ""San Francisco"" ] }, { ""State"": ""Texas"", ""City"": [""Houston"", ""San Antonio"", ""Dallas"" ] } ]"; // 反序列化数组为实体列表 var stateCityList = JsonConvert.DeserializeObject<List<StateCityModel>>(jsonData);
3. 转换为级联所需的字典
把列表转成以州名为键、城市列表为值的字典,适配级联下拉框需求:
var stateCityDict = stateCityList.ToDictionary(x => x.State, x => x.City);
4. 配置LookUpEdit级联逻辑
调整控件数据源配置,确保级联功能正常:
// 配置州下拉框:数据源为所有州名 lookUpEditState.Properties.DataSource = stateCityDict.Keys.ToList(); lookUpEditState.Properties.ValueMember = "ToString()"; // 配置城市下拉框的级联事件(若自动级联不生效,手动绑定) lookUpEditState.EditValueChanged += (s, e) => { if (lookUpEditState.EditValue is string selectedState && stateCityDict.ContainsKey(selectedState)) { lookUpEditCity.Properties.DataSource = stateCityDict[selectedState]; lookUpEditCity.Properties.DisplayMember = "ToString()"; lookUpEditCity.Properties.ValueMember = "ToString()"; } else { lookUpEditCity.Properties.DataSource = null; } };
关键注意事项
- 原代码中
stateCities是空的List<string>,这是无效的,必须传入实际的JSON字符串进行反序列化。 - 州下拉框的数据源应是字典的键集合(州名列表),城市下拉框需根据选中的州动态切换数据源,而非直接绑定整个字典。
内容的提问来源于stack exchange,提问作者user21922946
相关产品推荐
相关产品推荐

