You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:40:48