【问题标题】:Json Deserialised don't override the default values in the propertyJson Deserialised 不会覆盖属性中的默认值
【发布时间】:2017-03-22 14:22:58
【问题描述】:
 public class Student
 {
      public string Name { get; set;} = "ABCD";
      public List<Subject> Subjects {get; set;}
      public Student()
      {
            Subjects = new List<Subject>();
            SetDefaultSubject();
       }

      private void SetDefaultSubject()
      {
            this.Subjects.Add(new Subject(){Name = "English"});
            this.Subjects.Add(new Subject(){Name = "Maths"});
      }
}

public class Subject
{
     public string Name {get; set;}
}

我有一个像这样的 Json 字符串

var jsonStudentData = @"{""Name"":""ABC"",""Subjects"":[{""Name"":""English""},{""Name"":""Maths""},{""Name"":""Hindi""},{""Name"":""Social Studies""}]}";

这是我反序列化 jsonStudentData 的代码

JsonConvert.DeserializeObject<Student>(jsonStudentData);

我得到了输出
名称 = ABC, 学科[英语,数学,英语,数学,印地语,社会研究]

但我想要输出

姓名 = ABC, 学科[英语、数学、印地语、社会研究]

我在这里做错什么了吗。

【问题讨论】:

标签: c# json serialization deserialization


【解决方案1】:

嗯,你的期望是不正确的。基本上,JSON 反序列化器 - 完全合理地,IMO - 执行代码相当于:

var student = new Student
{
    Name = "ABC",
    Subjects =
    {
        // Each line here will just call Add
        new Subject { Name = "English" },
        new Subject { Name = "Maths" },
        new Subject { Name = "Hindi" },
        new Subject { Name = "Social Studies" },
    }
};

这就是您的 JSON 基本上说它应该做的事情。无论 JSON 说什么,都是您的 SetDefaultSubjects 添加更多信息。

我个人建议您删除从您的构造函数中对SetDefaultSubjects 的调用——也许添加一个CreateStudentWithDefaultSubjects 的工厂方法。

您也可以考虑将您的List 设置为某种类型的集合(例如HashSet)并让Subject 实现IEquatable&lt;Subject&gt;,这样您就可以添加重复项,它们将被忽略。

【讨论】:

    【解决方案2】:

    或者,您可以使用 C# 函数进行反序列化。

    程序集:System.Web.Extensions(在 System.Web.Extensions.dll 中)

        string jsonStudentData = @"{""Name"":""ABC"",""Subjects"":[{""Name"":""English""},{""Name"":""Maths""},{""Name"":""Hindi""},{""Name"":""Social Studies""}]}";
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        Student  newStudent = serializer.Deserialize<Student>(jsonStudentData);
    

    【讨论】:

    • 如果有帮助,请接受答案。这将有助于未来的其他人
    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    相关资源
    最近更新 更多