将JSON反序列化为2个不同的模型

saz*_*azr 32 c# json json.net

Newtonsoft.JSON库有一个简单的方法我可以自动将JSON反序列化为2个不同的模型/类吗?

例如,我得到了JSON:

[{
  "guardian_id": "1453",
  "guardian_name": "Foo Bar",
  "patient_id": "938",
  "patient_name": "Foo Bar",
}]
Run Code Online (Sandbox Code Playgroud)

我需要将其反序列化为以下模型:

class Guardian {

  [JsonProperty(PropertyName = "guardian_id")]
  public int ID { get; set; }

  [JsonProperty(PropertyName = "guardian_name")]
  public int Name { get; set; }
}


class Patient {

  [JsonProperty(PropertyName = "patient_id")]
  public int ID { get; set; }

  [JsonProperty(PropertyName = "patient_name")]
  public int Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以将此JSON反序列化为2个模型,而无需迭代JSON?也许JSON属性id会起作用?

Pair<Guardian, Patient> pair = JsonConvert.DeserializeObject(response.Content);
Run Code Online (Sandbox Code Playgroud)

Nis*_*arg 27

首先,您的模型略有不正确.名称属性需要是字符串,而不是整数:

class Guardian
{

    [JsonProperty(PropertyName = "guardian_id")]
    public int ID { get; set; }

    [JsonProperty(PropertyName = "guardian_name")]
    public string Name { get; set; }            // <-- This
}


class Patient
{

    [JsonProperty(PropertyName = "patient_id")]
    public int ID { get; set; }

    [JsonProperty(PropertyName = "patient_name")]
    public string Name { get; set; }            // <-- This
}
Run Code Online (Sandbox Code Playgroud)

一旦纠正了这一点,就可以将JSON字符串反序列化为两个不同类型的列表.在你的情况,List<Guardian>List<Patient>分别为:

string json = @"[{'guardian_id':'1453','guardian_name':'Foo Bar','patient_id':'938','patient_name':'Foo Bar'}]";
var guardians = JsonConvert.DeserializeObject<List<Guardian>>(json);
var patients = JsonConvert.DeserializeObject<List<Patient>>(json);
Run Code Online (Sandbox Code Playgroud)


Pet*_*r B 10

你想用1次调用来做它,你需要创建一个与JSON匹配的类.然后该类可以根据需要返回Guardian和返回Patient对象.此外,您还需要使用数组或列表作为返回类型,因为源JSON是一个数组.

要创建的类:

public class Pair
{
    public Pair()
    {
        Guardian = new Guardian();
        Patient = new Patient();
    }

    [JsonIgnore]
    public Guardian Guardian { get; set; }

    [JsonIgnore]
    public Patient Patient { get; set; }

    [JsonProperty(PropertyName = "guardian_id")]
    public int GuardianID
    {
        get { return Guardian.ID; }
        set { Guardian.ID = value; }
    }

    [JsonProperty(PropertyName = "guardian_name")]
    public string GuardianName
    {
        get { return Guardian.Name; }
        set { Guardian.Name = value; }
    }

    [JsonProperty(PropertyName = "patient_id")]
    public int PatientID
    {
        get { return Patient.ID; }
        set { Patient.ID = value; }
    }

    [JsonProperty(PropertyName = "patient_name")]
    public string PatientName
    {
        get { return Patient.Name; }
        set { Patient.Name = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

以及如何使用它:

var pairs = JsonConvert.DeserializeObject<Pair[]>(response.Content);

if (pairs.Any())
{
    var pair = pairs[0];
    Console.WriteLine(pair.Guardian.Name);
    Console.WriteLine(pair.Patient.Name);
}
Run Code Online (Sandbox Code Playgroud)


Pat*_*man 9

不是在一个调用中,似乎数据是一个数组,所以你需要更多的工作.

Zip 是加入两个单独的对象列表的关键方法:

Guardian[] guardians = JsonConvert.DeserializeObject<Guardian[]>(response.Content);
Patient[] patients = JsonConvert.DeserializeObject<Patient[]>(response.Content);

var combined = guardians.Zip(patients, (g, p) => Tuple.Create(g, p)).ToList();
Run Code Online (Sandbox Code Playgroud)

一次读取JSON会更容易,它只是一个对象.


Pet*_*r B 8

使用您显示的类型进行1次调用无法完成.您可以尝试<T>对每种类型使用通用方法,您还需要使用数组或列表作为返回类型,因为源JSON是一个数组:

var guardians = JsonConvert.DeserializeObject<Guardian[]>(response.Content);
var patients = JsonConvert.DeserializeObject<Patient[]>(response.Content);
Run Code Online (Sandbox Code Playgroud)

然后将两者合并,如果你需要它们配对.例如,如果你确定你总是只有一个:

var pair = new Pair(guardians[0], patients[0]);
Run Code Online (Sandbox Code Playgroud)