關鍵字:【序列化】【反序列化】【Json】【Newtonsoft.Json】
序列化和反序列化的規則
<1>NewtonSoft只能操作public字段or屬性
<2>Json字符串若提供類中沒有的字段or屬性,反序列化時會忽視之,並不拋出異常
<3>反序列化的過程:
調用無參構造函數,new出一個實例,然后使用Json字符串中包含的字段or屬性為成員賦值,Json字符串未提供的字段or屬性的值是無參構造函數初始化的值或是0,false,null;若類未提供無參構造函數,則調用有參構造函數,但是要保證類僅有一個有參構造函數,多個有參構造函數時,若不指定哪個構造函數來反序列化,編譯器會報錯。所以,盡可能的為會進行序列化和反序列化的類提供無參構造函數。
class Person { private string name; public string Name { get => name; set => name = value; } //年齡 private int age; public int Age { get => age; set => age = value; } //城市 public string City { get; set; } //技能 public List<string> languages; public Person() { Name = "Andrew Magic"; Age = 20; City = "Zhuhai"; languages = new List<string>(); } }
序列化一個對象
Person p1 = new Person(); string p1JsonStr = JsonConvert.SerializeObject(p1);
反序列化一個對象
string p2JsonStr = "{\"Name\":\"Jack\" }"; Person p2 = JsonConvert.DeserializeObject<Person>(p2JsonStr);
序列化多個對象
Person p3 = new Person(); p3.Name = "LiMing"; p3.Age = 22; p3.City = "Shanghai"; p3.languages.AddRange(new string[] { "C", "Java", "PHP" }); Person p4 = new Person(); p4.Name = "ZhangSan"; p4.Age = 20; p4.City = "Beijing"; p4.languages.AddRange(new string[] { "C#", "Python", "Go" }); List<Person> list = new List<Person> { p3, p4 }; string objectsJsonStr = JsonConvert.SerializeObject(list);
反序列化多個對象
List<Person> list = JsonConvert.DeserializeObject<List<Person>>(objectsJsonStr); foreach (Person item in list) { Console.WriteLine(item.Name); }
