C#查询JSON数组中指定药物strength时报Where方法不存在错误如何解决
问题解决方法
错误原因
报错是两个问题共同导致的:
- 实体类和JSON结构的映射不匹配,反序列化后属性会为空
Medication是普通实体类而非集合类型,不能直接调用LINQ的Where扩展方法,你需要先把它内部存储的三类药品集合合并后再查询
修复步骤
步骤1:修正实体类的JSON映射
给实体类属性加上JsonProperty注解,和JSON里的字段名对应:
public class Rootobject { // JSON根节点字段是medic,不是medications [JsonProperty("medic")] public List<Medication> medications { get; set; } } public class Medication { // 对应JSON里的ace字段 [JsonProperty("ace")] public List<aceInhibitors> aceinhibitors { get ; set ; } // 对应JSON里的anti字段 [JsonProperty("anti")] public List<anti> antianginal {get; set; } // 对应JSON里的anticoag字段 [JsonProperty("anticoag")] public List<anticoag> anticoagulants {get; set; } } // 其余三个子类的JsonProperty你已经加对了,不需要修改
另外因为aceInhibitors、anti、anticoag三个类的属性完全一致,推荐你提取一个公共基类,方便后续查询:
public class MedicineBase { [JsonProperty("name")] public string name { get; set; } [JsonProperty("strength")] public string strength { get; set; } [JsonProperty("dose")] public string dose { get; set; } [JsonProperty("route")] public string route { get; set; } [JsonProperty("sig")] public string sig { get; set; } [JsonProperty("pillCount")] public string pillCount { get; set; } [JsonProperty("refills")] public string refills { get; set; } } // 三个子类直接继承即可 public class aceInhibitors : MedicineBase {} public class anti : MedicineBase {} public class anticoag : MedicineBase {}
步骤2:修正查询逻辑
先把Medication实例里的三个集合合并,再做筛选查询:
class Program { static void Main(string[] args) { string jsonString = @"..."; // 对应上述JSON字符串 Console.WriteLine("Enter the Medication name in which you want to Find STRENGTH value :"); string medicname = Console.ReadLine().Trim(); // 加Trim去掉首尾空格 var rootInstance = JsonConvert.DeserializeObject<Rootobject>(jsonString); var medicationObj = rootInstance.medications[0]; // 合并三类药品集合 var allMedicines = new List<MedicineBase>(); allMedicines.AddRange(medicationObj.aceinhibitors); allMedicines.AddRange(medicationObj.antianginal); allMedicines.AddRange(medicationObj.anticoagulants); // 查询匹配的药品strength,忽略大小写匹配体验更好 var result = allMedicines.Where(x=>x.name.Equals(medicname, StringComparison.OrdinalIgnoreCase)) .Select(t => t.strength) .ToList(); // 可选输出逻辑 if(result.Any()) { Console.WriteLine($"对应药品规格为:{string.Join("、", result)}"); } else { Console.WriteLine("未查询到对应药品"); } } }
如果你不想提取基类,也可以分别查询三个集合再合并结果,写法如下:
var result = medicationObj.aceinhibitors.Where(x=>x.name == medicname).Select(x=>x.strength) .Concat(medicationObj.antianginal.Where(x=>x.name == medicname).Select(x=>x.strength)) .Concat(medicationObj.anticoagulants.Where(x=>x.name == medicname).Select(x=>x.strength)) .ToList();
内容的提问来源于stack exchange,提问作者NewDeveloper
相关产品推荐
相关产品推荐

