Newtonsoft.JSON是否支持自动将JSON反序列化为两个不同模型?
没问题!Json.NET(也就是Newtonsoft.JSON)完全能搞定这个需求,给你分享几个简单好用的方法:
方案1:借助JObject拆分转换
这是最直接的方式,先把JSON反序列成JObject/JArray,再分别转成你的两个模型类:
// 你的JSON字符串 string json = @"[{ ""guardian_id"": ""1453"", ""guardian_name"": ""Foo Bar"", ""patient_id"": ""938"", ""patient_name"": ""Foo Bar"" }]"; // 先反序列成JArray var jArray = JArray.Parse(json); // 遍历每个对象,分别转换为两个模型 List<Guardian> guardians = new List<Guardian>(); List<Patient> patients = new List<Patient>(); foreach (var jObj in jArray) { guardians.Add(jObj.ToObject<Guardian>()); patients.Add(jObj.ToObject<Patient>()); }
⚠️ 重要小提醒:你定义的Guardian和Patient类里,Name属性写成了int类型,但JSON里是字符串值,这肯定会反序列化失败,记得改成string类型哦:
class Guardian { [JsonProperty(PropertyName = "guardian_id")] public int ID { get; set; } [JsonProperty(PropertyName = "guardian_name")] public string Name { get; set; } // 修正为string类型 } class Patient { [JsonProperty(PropertyName = "patient_id")] public int ID { get; set; } [JsonProperty(PropertyName = "patient_name")] public string Name { get; set; } // 修正为string类型 }
方案2:用中间类过渡
如果你的JSON结构更复杂,或者需要更明确的映射/校验逻辑,可以先定义一个包含所有属性的中间类,反序列化后再拆分到目标模型:
// 中间类:包含JSON里的所有属性 public class CombinedModel { [JsonProperty("guardian_id")] public int GuardianId { get; set; } [JsonProperty("guardian_name")] public string GuardianName { get; set; } [JsonProperty("patient_id")] public int PatientId { get; set; } [JsonProperty("patient_name")] public string PatientName { get; set; } } // 反序列化并拆分到目标模型 var combinedList = JsonConvert.DeserializeObject<List<CombinedModel>>(json); List<Guardian> guardians = combinedList.Select(c => new Guardian { ID = c.GuardianId, Name = c.GuardianName }).ToList(); List<Patient> patients = combinedList.Select(c => new Patient { ID = c.PatientId, Name = c.PatientName }).ToList();
这个方案的好处是可以在中间层做数据校验、格式转换(比如把字符串类型的ID转成int),逻辑更清晰可控。
方案3:自定义JsonConverter(进阶)
如果需要更自动化的批量处理,也可以写一个自定义转换器,不过对于你的需求来说,前两个方案已经足够简单好用了,这个可以作为扩展思路:
public class DualModelConverter : JsonConverter { public override bool CanConvert(Type objectType) { // 指定转换的目标类型:包含两个模型的元组 return objectType == typeof((Guardian, Patient)); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jObj = JObject.Load(reader); var guardian = jObj.ToObject<Guardian>(serializer); var patient = jObj.ToObject<Patient>(serializer); return (guardian, patient); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // 如果需要把两个模型序列回JSON,可以在这里实现逻辑 throw new NotImplementedException(); } } // 使用方式 var result = JsonConvert.DeserializeObject<List<(Guardian, Patient)>>(json, new DualModelConverter());
内容的提问来源于stack exchange,提问作者sazr
相关产品推荐
相关产品推荐

