是否可以从两个类中形成一个对象,然后将其序列化为JSON,并且当反序列化它时,能够获得这两个对象。
说我有:Student
和List<Course>
的对象
是否可以将这两个对象组合在一个JSON对象中。
我需要这个,因为在我正在进行的项目中为每个JSON对象构建一个类会非常累人!
答案 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;
答案 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);
亲自试试