Newtonsoft.Json功能:
0.基本用法
1.忽略某些属性
2.默认值的处理
3.空值的处理
4.支持非公共成员
5.日期处理
6.自定义序列化的字段名称
7.动态决定属性是否序列化
8.枚举值的自定义格式化问题
9.自定义类型转换
10.全局序列化设置
0.基本用法
public class Person { private string Surname = "李";//姓 public string Name { get; set; }//名称 private string Sex { get; set; }//性别 public Color Eye { get; set; }//眼睛 public bool IsAdult { get; set; }//是否成年 public int Age { get; set; }//年龄 public DateTime Born { get; set; }//出生日期 }
Person person = new Person() { Name = "四", Eye = Color.Black, IsAdult = true, Age = 18, Born = DateTime.Now }; string json = JsonConvert.SerializeObject(person); person = JsonConvert.DeserializeObject<Person>(json);
json结果:
{"Name":"四","Eye":"Black","IsAdult":true,"Age":18,"Born":"2019-05-06T19:16:23.7298046+08:00"}
1.忽略某些属性
[JsonObject(MemberSerialization.OptIn)]//默认情况下,所有的成员不会被序列化,只有标注Newtonsoft.Json.JsonProperty或System.Runtime.Serialization.DataMember特性的成员才会被序列化, public class Person { private string Surname = "李";//姓 [JsonProperty] public string Name { get; set; }//名称 private string Sex { get; set; }//性别 public Color Eye { get; set; }//眼睛 public bool IsAdult { get; set; }//是否成年 public int Age { get; set; }//年龄 public DateTime Born { get; set; }//出生日期 }
Person person = new Person() { Name = "四", Eye = Color.Black, IsAdult = true, Age = 18, Born = DateTime.Now }; string json = JsonConvert.SerializeObject(person);
json结果:
{"Name":"四"}
[JsonObject(MemberSerialization.OptOut)]//默认情况下,所有公共成员都是序列化的。可以使用Newtonsoft.Json.JsonIgnore或System.NonSerialized排除公共成员 public class Person { private string Surname = "李";//姓 [JsonIgnore] public string Name { get; set; }//名称 private string Sex { get; set; }//性别 public Color Eye { get; set; }//眼睛 public bool IsAdult { get; set; }//是否成年 public int Age { get; set; }//年龄 public DateTime Born { get; set; }//出生日期 }
Person person = new Person() { Name = "四", Eye = Color.Black, IsAdult = true, Age = 18, Born = DateTime.Now }; string json = JsonConvert.SerializeObject(person);
json结果:
{"Eye":"Black","IsAdult":true,"Age":18,"Born":"2019-05-06T19:40:32.1496495+08:00"}
[JsonObject(MemberSerialization.Fields)]//所有公共和私有字段都被序列化。可以使用Newtonsoft.Json.JsonIgnore或System.NonSerialized排除成员 public class Person { private string Surname = "李";//姓 public string Name { get; set; }//名称 private string Sex { get; set; }//性别 public Color Eye { get; set; }//眼睛 public bool IsAdult { get; set; }//是否成年 public int Age { get; set; }//年龄 public DateTime Born { get; set; }//出生日期 }
Person person = new Person() { Name = "四", Eye = Color.Black, IsAdult = true, Age = 18, Born = DateTime.Now }; string json = JsonConvert.SerializeObject(person);
json结果:
{"Surname":"李","<Name>k__BackingField":"四","<Sex>k__BackingField":null,"<Eye>k__BackingField":"Black","<IsAdult>k__BackingField":true,"<Age>k__BackingField":18,"<Born>k__BackingField":"2019-05-06T20:01:20.623058+08:00"}
2.默认值的处理
DefaultValueHandling.Include | 在序列化对象时,包含成员值与成员默认值相同的成员。包含的成员被写入JSON。反序列化时没有效果。 |
DefaultValueHandling.Ignore | 在序列化对象时忽略成员值与成员默认值相同的成员,这样就不会将其写入JSON。这个选项将忽略对象和可空类型的所有默认值(例如null);用于整数、小数和浮点数;布尔语false)。可以通过在属性上放置System.ComponentModel.DefaultValueAttribute来更改被忽略的默认值。 |
DefaultValueHandling.Populate | 在反序列化时,具有默认值但没有JSON的成员将被设置为其默认值。 |
DefaultValueHandling.IgnoreAndPopulate | 在序列化对象时忽略成员值与成员默认值相同的成员,在反序列化时将成员设置为其默认值。 |
public class Person { private string Surname = "李";//姓 [DefaultValue("四")] public string Name { get; set; }//名称 private string Sex { get; set; }//性别 public Color Eye { get; set; }//眼睛 public bool IsAdult { get; set; }//是否成年 public int Age { get; set; }//年龄 public DateTime Born { get; set; }//出生日期 }
JsonSerializerSettings jsetting = new JsonSerializerSettings(); jsetting.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate; Person person = new Person() { Name = "四", Eye = Color.Black, IsAdult = true, Age = 18, Born = DateTime.Now }; string json = JsonConvert.SerializeObject(person, jsetting);
3.空值的处理
3.1.可以通过全局配置JsonSerializerSettings.NullValueHandling来设置所有成员。
NullValueHandling.Include | 在序列化和反序列化对象时包含空值。 |
NullValueHandling.Ignore | 在序列化和反序列化对象时忽略空值。 |
{ private string Surname = "李";//姓 public string Name { get; set; }//名称 private string Sex { get; set; }//性别 public Color Eye { get; set; }//眼睛 public bool IsAdult { get; set; }//是否成年 public int Age { get; set; }//年龄 public DateTime Born { get; set; }//出生日期 }
JsonSerializerSettings jsetting = new JsonSerializerSettings(); jsetting.NullValueHandling = NullValueHandling.Ignore; Person person = new Person() { Name = null, Eye = Color.Black, IsAdult = true, Age = 18, Born = DateTime.Now }; string json = JsonConvert.SerializeObject(person, jsetting);
json结果:
{"Eye":"Black","IsAdult":true,"Age":18,"Born":"2019-05-07T23:13:29.6252766+08:00"}
3.2.利用JsonProperty对指定成员进行设置。
public class Person { private string Surname = "李";//姓 [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public string Name { get; set; }//名称 private string Sex { get; set; }//性别 public Color Eye { get; set; }//眼睛 public bool IsAdult { get; set; }//是否成年 public int Age { get; set; }//年龄 public DateTime Born { get; set; }//出生日期 }
Person person = new Person() { Name = null, Eye = Color.Black, IsAdult = true, Age = 18, Born = DateTime.Now }; string json = JsonConvert.SerializeObject(person);
json结果:
{"Eye":"Black","IsAdult":true,"Age":18,"Born":"2019-05-07T23:44:18.8010434+08:00"}
4.支持非公共成员
public class Person { [JsonProperty] private string Surname = "李";//姓 public string Name { get; set; }//名称 private string Sex { get; set; }//性别 public Color Eye { get; set; }//眼睛 public bool IsAdult { get; set; }//是否成年 public int Age { get; set; }//年龄 public DateTime Born { get; set; }//出生日期 }
Person person = new Person() { Name = null, Eye = Color.Black, IsAdult = true, Age = 18, Born = DateTime.Now }; string json = JsonConvert.SerializeObject(person);
json结果:
{"Surname":"李","Name":null,"Eye":"Black","IsAdult":true,"Age":18,"Born":"2019-05-07T23:48:18.7837696+08:00"}
5.日期处理
6.自定义序列化的字段名称
public class Person { private string Surname = "李";//姓 [JsonProperty(PropertyName = "名称")] public string Name { get; set; }//名称 private string Sex { get; set; }//性别 public Color Eye { get; set; }//眼睛 public bool IsAdult { get; set; }//是否成年 public int Age { get; set; }//年龄 public DateTime Born { get; set; }//出生日期 }
Person person = new Person() { Name = null, Eye = Color.Black, IsAdult = true, Age = 18, Born = DateTime.Now }; string json = JsonConvert.SerializeObject(person);
json结果:
{"名称":null,"Eye":"Black","IsAdult":true,"Age":18,"Born":"2019-05-08T00:09:07.7562068+08:00"}
7.动态决定属性是否序列化
8.枚举值的自定义格式化问题
public enum ProfessionType : int { teacher = 0,//教师 worker = 1,//工人 peasant = 2//农民 } public class Person { private string Surname = "李";//姓 public string Name { get; set; }//名称 private string Sex { get; set; }//性别 public Color Eye { get; set; }//眼睛 public bool IsAdult { get; set; }//是否成年 public int Age { get; set; }//年龄 public DateTime Born { get; set; }//出生日期 [JsonConverter(typeof(StringEnumConverter))] public ProfessionType Profession { get; set; }//职业 } Person person = new Person() { Name = null, Eye = Color.Black, IsAdult = true, Age = 18, Born = DateTime.Now, Profession= ProfessionType.worker }; string json = JsonConvert.SerializeObject(person);
json结果:
{"Name":null,"Eye":"Black","IsAdult":true,"Age":18,"Born":"2019-05-08T00:21:16.2198725+08:00","Profession":"worker"}
9.自定义类型转换
10.全局序列化设置
JsonSerializerSettings jsetting = new JsonSerializerSettings(); Person person = new Person() { Name = null, Eye = Color.Black, IsAdult = true, Age = 18, Born = DateTime.Now, Profession= ProfessionType.worker }; string json = JsonConvert.SerializeObject(person);