从单独的类中序列化和反序列化JSON对象,而不需要独立的类?

时间:2017-07-26 12:23:17

标签: c# .net json.net

是否可以从两个类中形成一个对象,然后将其序列化为JSON,并且当反序列化它时,能够获得这两个对象。 说我有:StudentList<Course>的对象 是否可以将这两个对象组合在一个JSON对象中。 我需要这个,因为在我正在进行的项目中为每个JSON对象构建一个类会非常累人!

5 个答案:

答案 0 :(得分:2)

是的,这是可能的,而且实际上非常简单。

假设您有两个这样的对象:

var student = new Student { Name = "Joe Schmoe" };

var courses = new List<Course>
{
    new Course { Title = "Underwater Basket Weaving 101" },
    new Course { Title = "History of Pancakes 102" }
};

在序列化方面,只需使用匿名对象将对象组合在一起,然后序列化:

var anon = new { Student = student, Courses = courses };

var json = JsonConvert.SerializeObject(anon, Formatting.Indented);

以下是您将获得的JSON:

{
  "Student": {
    "Name": "Joe Schmoe"
  },
  "Courses": [
    {
      "Title": "Underwater Basket Weaving 101"
    },
    {
      "Title": "History of Pancakes 102"
    }
  ]
}

您可以通过这种方式将所需数量的对象组合在一起。 另一方面,您可以反序列化为动态变量(幕后为JObject),然后使用ToObject<T>()从中重新创建原始的强类型对象。

dynamic obj = JsonConvert.DeserializeObject(json);
var student = obj.Student.ToObject<Student>();
var courses = obj.Courses.ToObject<List<Course>>();

往返演示:https://dotnetfiddle.net/OKJBg2

或者,如果您不喜欢动态变量/ JObject想法,可以使用反序列化反例来反序列化回匿名对象。要做到这一点,首先要创建一个空的匿名对象,其形状与JSON相同,以用作&#34;模板&#34;然后将它与JSON一起传递给JsonConvert.DeserializeAnonymousType

var template = new { Student = new Student(), Courses = new List<Course>() };
var anon = JsonConvert.DeserializeAnonymousType(json, template);

Student student = anon.Student;
List<Course> courses = anon.Courses;

演示:https://dotnetfiddle.net/Inz0r8

答案 1 :(得分:1)

Is it possible to form an object from two classes and then serialize it to JSON

是的,只需使用JObject

中的Merge即可

例如这里是一个例子

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

    class Course
    {
        public string Title { get; set; } 
    }

         var std = new Student() {Name = "foo"};
        var lstCours = new List<Course>() { new Course(){Title = "math"}};
        var stdJson = JsonConvert.SerializeObject(new {student=std});
        var lstCoursJson = JsonConvert.SerializeObject( new{Cours= lstCours});  
        JObject jObjectStd = JObject.Parse(stdJson);
        JObject jObjectLstCours = JObject.Parse(lstCoursJson);
        jObjectStd.Merge(jObjectLstCours,new JsonMergeSettings(){MergeArrayHandling = MergeArrayHandling.Concat}); 
        Console.WriteLine(jObjectStd.ToString());

这里你得到的合并

{
  "student": {
    "Name": "foo"
  },
  "Cours": [
    {
      "Title": "math"
    }
  ]
}
使用JSON.net

来反序列化这非常简单
var stdParsed = JObject.Parse(json).Property("student").Value.ToString();
             var lstCoursParsed = JObject.Parse(json).Property("Cours").Value.ToString();
            var stdDes = JsonConvert.DeserializeObject<Student>(stdParsed);
            var lstCoursDes = JsonConvert.DeserializeObject<List<Course>>(lstCoursParsed); 

答案 2 :(得分:1)

序列化KeyValuePair<Student, List<Course>>并再次反序列化为KeyValuePair。

var student = ...;
var courses = ...;

var json = JsonConvert.SerializeObject(new KeyValuePair<Student, List<Course>>(student, courses));

然后,以这种方式反序列化:

var pair = JsonConvert.DeserializeObject<KeyValuePair<Student, List<Course>>>(json);
var student = pair.Key;
var courses = pair.Value;

这是一种解决方法,但它易于理解,并且非常易于使用(与JObject或类合并它们相比)。

答案 3 :(得分:0)

只需创建new Class,其中包含这样的2个对象

public class StudentWithCours
{
    public Student student { get; set; }

    public List<Course> course { get; set; }
}

之后你可以像这样序列化/反序列化类范例

.......

StudentWithCours myObject = new StudentWithCours();
//your some logic here]
var serilizedObject = JsonConvert.SerializeObject(myObject);
var deserilizedObject =  JsonConvert.DeserializeObject<StudentWithCours>(serilizedObject);

答案 4 :(得分:-1)

是的。这个单线程依赖于Newtonsoft NuGet软件包,它比默认的序列化程序更受欢迎。

var myObject = ...;
Newtonsoft.Json.JsonConvert.SerializeObject(myObject);

文档: Serializing and Deserializing JSON

其他可能性:

您可以使用JavaScriptSerializer类(添加对System.Web.Extensions的引用):

using System.Web.Script.Serialization;

var json = new JavaScriptSerializer().Serialize(obj);

其他选项可用here,您可以在其中找到以上两个答案以及其他许多答案。

一段代码:

public class Student
{
    public string Name { get; set; }
    public List<Course> Courses { get; set; } = new List<Course>();

    public class Course
    {
        public string Name { get; set; }
        public string Code { get; set; }
    }
}

var student = new Student
{
    Name = "Jack",
    Courses = new List<Student.Course>
    {
        new Student.Course() {Name = "MATH", Code = "MA"},
        new Student.Course() {Name = "Science", Code = "SC"}
    }
};
var str = JsonConvert.SerializeObject(student);
var studentDeserialized = JsonConvert.DeserializeObject<Student>(str);

亲自试试