如何用C#处理Reader传递的JSON数组并映射属性至jobPreferencesEvent?
问题描述
我有如下格式的JSON数组:
[ { "checked":true, "discipline":"Registered Nurse", "disciplineId":1, "specialty":"OR", "specialtyId":7 }, { "checked":true, "discipline":"Registered Nurse", "disciplineId":1, "specialty":"Ambulatory OR", "specialtyId":62 }, { "checked":true, "discipline":"Registered Nurse", "disciplineId":1, "specialty":"Pedi-OR", "specialtyId":101 } ]
该JSON数据通过Reader传递,我希望用C#按照如下代码的逻辑,将JSON中的属性映射到jobPreferencesEvent的对应字段:
jobPreferencesEvent.preferred_discipline = reader["discipline"] != DBNull.Value ? reader["discipline"].ToString() : "0"; jobPreferencesEvent.preferred_specialty = reader["speciality"] != DBNull.Value ? reader["speciality"].ToString() : "0";
解决方案
1. 定义匹配的实体类
先创建和JSON结构对应的实体类,方便后续序列化/反序列化操作:
// 对应JSON单条数据的实体类 public class DisciplineSpecialty { public bool Checked { get; set; } public string Discipline { get; set; } public int DisciplineId { get; set; } public string Specialty { get; set; } public int SpecialtyId { get; set; } } // 假设你的jobPreferencesEvent类结构如下 public class JobPreferencesEvent { public string Preferred_Discipline { get; set; } public string Preferred_Specialty { get; set; } }
2. 使用Newtonsoft.Json处理(需NuGet安装Newtonsoft.Json)
// 从Reader读取完整JSON字符串 string jsonContent = new StreamReader(reader).ReadToEnd(); // 将JSON反序列化为实体类列表 var disciplineItems = JsonConvert.DeserializeObject<List<DisciplineSpecialty>>(jsonContent); // 映射字段(示例取数组第一个元素,需处理所有元素可加foreach循环) var jobPreferencesEvent = new JobPreferencesEvent(); if (disciplineItems.Any()) { var targetItem = disciplineItems.First(); // 按需求逻辑赋值,注意原代码里的"speciality"是拼写错误,JSON字段为"specialty" jobPreferencesEvent.Preferred_Discipline = !string.IsNullOrEmpty(targetItem.Discipline) ? targetItem.Discipline : "0"; jobPreferencesEvent.Preferred_Specialty = !string.IsNullOrEmpty(targetItem.Specialty) ? targetItem.Specialty : "0"; }
3. 使用System.Text.Json处理(.NET Core/.NET 5+内置)
// 从Reader读取完整JSON字符串 string jsonContent = new StreamReader(reader).ReadToEnd(); // 将JSON反序列化为实体类列表 var disciplineItems = JsonSerializer.Deserialize<List<DisciplineSpecialty>>(jsonContent); // 映射字段 var jobPreferencesEvent = new JobPreferencesEvent(); if (disciplineItems != null && disciplineItems.Any()) { var targetItem = disciplineItems.First(); jobPreferencesEvent.Preferred_Discipline = !string.IsNullOrEmpty(targetItem.Discipline) ? targetItem.Discipline : "0"; jobPreferencesEvent.Preferred_Specialty = !string.IsNullOrEmpty(targetItem.Specialty) ? targetItem.Specialty : "0"; }
注意事项
- 原代码中的
speciality是拼写错误,JSON对应的字段为specialty,映射时需使用正确名称。 - 若需要处理JSON数组中的所有元素,可通过
foreach循环遍历disciplineItems,逐个创建或更新JobPreferencesEvent实例。
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

