首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将JSON反序列化为2个不同的模型

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

Stack Overflow用户
提问于 2018-04-04 16:06:44
回答 9查看 6.9K关注 0票数 32

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

例如,我得到JSON:

代码语言:javascript
复制
[{
  "guardian_id": "1453",
  "guardian_name": "Foo Bar",
  "patient_id": "938",
  "patient_name": "Foo Bar",
}]

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

代码语言:javascript
复制
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; }
}

有没有一种简单的方法可以将这个JSON反序列化为2个模型,而不必迭代JSON?也许JSON属性ids可以正常工作?

代码语言:javascript
复制
Pair<Guardian, Patient> pair = JsonConvert.DeserializeObject(response.Content);
EN

回答 9

Stack Overflow用户

发布于 2018-04-04 16:13:55

首先,你的模型有一点不正确。name属性需要是字符串,而不是整数:

代码语言:javascript
复制
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
}

一旦纠正了这个问题,就可以将JSON字符串反序列化为两个不同类型的列表。在您的示例中,分别为List<Guardian>List<Patient>

代码语言:javascript
复制
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);
票数 27
EN

Stack Overflow用户

发布于 2018-04-04 16:32:52

如果你想通过一次调用来完成,你需要创建一个与JSON匹配的类。然后,该类可以根据需要返回GuardianPatient对象。此外,您还需要使用数组或列表作为返回类型,因为源JSON是一个数组。

要创建的类:

代码语言:javascript
复制
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; }
    }
}

以及如何使用它:

代码语言:javascript
复制
var pairs = JsonConvert.DeserializeObject<Pair[]>(response.Content);

if (pairs.Any())
{
    var pair = pairs[0];
    Console.WriteLine(pair.Guardian.Name);
    Console.WriteLine(pair.Patient.Name);
}
票数 11
EN

Stack Overflow用户

发布于 2018-04-04 16:10:49

对于您所显示的类型,一次调用是不可能完成的。您可以尝试对每个类型使用通用的<T>方法,而且您还需要对返回类型使用数组或列表,因为源JSON是一个数组:

代码语言:javascript
复制
var guardians = JsonConvert.DeserializeObject<Guardian[]>(response.Content);
var patients = JsonConvert.DeserializeObject<Patient[]>(response.Content);

然后,如果您需要将它们配对,则将两者组合在一起。例如,如果你确定你总是只有其中之一:

代码语言:javascript
复制
var pair = new Pair(guardians[0], patients[0]);
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49645813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档