NullValueHandling .Ignore 忽略为NULL 的值
NullValueHandling .Include Newtonsoft.Json 的序列化与反序列化
⾸先补充⼀点,Json.Net 是⽀持序列化和反序列化DataTable,DataSet,Entity Framework 和NHibernate 的.我举例说明DataTable 的序列化和反序列化.
创建⼀个DataTable 对象,如下:
DataTable dt = new  DataTable();
DataColumn dcName = new  DataColumn("Name");
DataColumn dcAge = new  DataColumn("Age");
DataColumn dcCity = new  DataColumn("City");
dt.Columns.Add(dcName);
dt.Columns.Add(dcAge);
dt.Columns.Add(dcCity);
for  (int  i = 0; i < 10; i++)
{
DataRow dr = dt.NewRow();
dr[0] = "Name" + i;
dr[1] = "Age" + i;
dr[2] = "City" + i;
dt.Rows.Add(dr);
}
序列化:
string  json = JsonConvert.SerializeObject(dt);
Console.WriteLine(json);
结果:
利⽤上⾯得到的序列化字符串反序列化:
DataTable dt1 = JsonConvert.DeserializeObject<DataTable>(json);
for (int i = 0; i < dt1.Rows.Count; i++)
{
json检查
DataRow dr = dt1.Rows[i];
Console.WriteLine("{0}\t{1}\t{2}\t", dr[0], dr[1], dr[2]);
}
结果:
本节内容
预备知识:
要想实现对Json.Net 序列化和反序列化的控制,就要⽤到类JsonSerializerSettings ,⽤法很简单实例化⼀个对象,并把它赋值给JsonConvert 的参数即可.
var  jSetting = new  JsonSerializerSettings();
string  json = JsonConvert.SerializeObject(obj,jSetting);
开始之前,我还是先创建⼀员⼯类:
public  class  Staff
{
public  string  Name { get ; set ; }
public  int  Age { get ; set ; }
public  string  Gender { get ; set ; }
public  string  DepartmentName { get ; set ; }
public  Staff Leader { get ; set ; }
}
⼀.空值的处理
这⾥的空值指的是引⽤类型为NULL 时,Json.Net 如何处理.通过设置jSetting.NullValueHandling 的值来确定,该值为枚举类型.
NullValueHandling.Include默认值,包括为NULL的值
DefaultValueHandling.Ignore序列化和反序列化时,忽略默认值DefaultValueHandling.Include序列化和反序列化时,包含默认值
OptOut默认值,类中所有公有成员会被序列化,如果不想被序列化,可以⽤特性JsonIgnore
OptIn 默认情况下,所有的成员不会被序列化,类中的成员只有标有特性JsonProperty的才会被序列化,当类的成员很多,但客户端仅仅需要⼀部分数据时,很有⽤
实例:
Staff jack = new Staff { Name = "Jack", Age = 31, Gender = "Male", DepartmentName = "Personnel Department", Leader = null };            var jSetting = new JsonSerializerSettings();
jSetting.NullValueHandling = NullValueHandling.Ignore;
string json = JsonConvert.SerializeObject(jack,jSetting);
Console.WriteLine(json);
结果:
2.默认值的处理
⼀般是对于值类型的处理,通过设置jSetting.DefaultValueHandling的值来确定,该值为枚举类型.
给成员设置默任值,⽤到"DefaultValue(value)"特性,当然别忘了引⼊命名空间"System.ComponentModel",假设员⼯的年龄默认值为30
[DefaultValue(30)]
public int Age { get; set; }
序列化时我想忽略为默认值的成员
Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", Leader = null };            var jSetting = new JsonSerializerSettings();
jSetting.DefaultValueHandling = DefaultValueHandling.Ignore;
string json = JsonConvert.SerializeObject(jack,jSetting);
Console.WriteLine(json);
结果:
3.忽略某些属性
⾸先介绍Json.Net序列化的模式:OptOut 和 OptIn.
假如客户仅仅需要员⼯的姓名,此时
[JsonObject(Newtonsoft.Json.MemberSerialization.OptIn)]
public class Staff
{
[JsonProperty]
public string Name { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
public string DepartmentName { get; set; }
public Staff Leader { get; set; }
}
序列化:
Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", Leader = null };
string json = JsonConvert.SerializeObject(jack);
结果:
如果客户不想要员⼯的领导信息
public class Staff
{
public string Name { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
public string DepartmentName { get; set; }
[JsonIgnore]
public Staff Leader { get; set; }
}
序列化:
Staff tom = new Staff { Name = "Tome", Age = 42, Gender = "Male", DepartmentName = "Personnel Department"};
Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", Leader = tom };
string json = JsonConvert.SerializeObject(jack);
Console.WriteLine(json);
结果:
4.⽀持⾮公共成员
Json.Net序列化对象时,默认情况下仅仅序列化公有成员,如果想要⾮公有成员也被序列化,就要在该成员上加特性"JsonProperty"
5.⽇期处理
  JsonConverters会在序列化和反序列化时被⽤到。JsonConverters允许⼿动对Json的控制。当Json的
结构很复杂和你想改变⼀个类型怎么样被序列化时,这是⾮常有⽤的。当⼀个JsonConverters被添加到JsonSerializer时,它会检查每⼀要被序列化和反序列化的值,并返回CanConvert,如果为True,则JsonConverter读和写这个值;需要注意的是,虽然JsonConverter能够使你可以完全的控制Json的值,但是很多的Json.Net序列化的特性被限制,像是类型名称和引⽤处理。所有的JsonConvert都在命名空间"Newtonsoft.Json.Converters"下
5.1IsoDateTimeConverter 和 JavaScriptDateTimeConverter
这是Json.Net中⾃带的两个处理⽇期的类,默认是IsoDateTimeConverter ,它的格式是"yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK".另⼀个是JavaScriptTimeConverter,它的格式是 "new Date(ticks)",其实返回的是⼀个JavaScript的Date对象.
有两种⽅式来应⽤JsonConverter,改变Json序列化和反序列化的⾏为.
5.1.1如果你要序列化的⽇期格式是统⼀的,可以考虑如下⽅式
假设我们为员⼯添加两个⽇期类型的成员,出⽣⽇期和⼊职⽇期
public class Staff
{
public string Name { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
public string DepartmentName { get; set; }
public Staff Leader { get; set; }
public DateTime BirthDate { get; set; }
public DateTime EmploymentDate { get; set; }
}
我们的客户要求⽇期类型的成员返回javascript的⽇期对象
Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male",
DepartmentName = "Personnel Department", BirthDate = new DateTime(1982,2,12), EmploymentDate = new DateTime(2010,12,12) };
string json = JsonConvert.SerializeObject(jack,new JavaScriptDateTimeConverter());
Console.WriteLine(json);
结果:
5.1.2如果想要不同的⽇期类型成员序列化后,以不同的形式显⽰.
现在我们的客户要求出⽣⽇期以"ISO"标准⽇期格式返回,⼊职⽇期以Javascript的Date对象格式返回,修改我们的员⼯类
public class Staff
{
public string Name { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
public string DepartmentName { get; set; }
public Staff Leader { get; set; }
[JsonConverter(typeof(IsoDateTimeConverter))]
public DateTime BirthDate { get; set; }
[JsonConverter(typeof(JavaScriptDateTimeConverter))]
public DateTime EmploymentDate { get; set; }
}
是的,通过特性"JsonConverter"来实现差异化的
序列化:
Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male",
DepartmentName = "Personnel Department", BirthDate = new DateTime(1982,2,12), EmploymentDate = new DateTime(2010,12,12) };
string json = JsonConvert.SerializeObject(jack);
Console.WriteLine(json);
结果:
5.2⾃定义⽇期格式
客户现在提出要求,希望得到的⽇期格式是符合中国⼈习惯的格式.要求返回的格式是"2012年4⽉20⽇".挑战来了,没有挑战就没有进步,我喜欢挑战.光说是没有⽤的!先分析⼀下怎么解决这个问题.我考虑了两种思路.
  思路⼀:
研究了⼀下上⾯两个⽇期处理类,发现他们都是继承了基类"DateTimeConverterBase",所以我们可以参考"IsoDatetimeConverter"的实现⽅式,⾃⼰新建⼀个处理⽇期格式的转换器类.这种⽅式的缺点是可能要花⼤量的时间去研究,⽐较费时费⼒.优点就是可以对⽇期格式随⼼所欲的控制.
  思路⼆:
我⼜研究了⼀下"IsoDatetimeConverter",发现它的⽇期格式其实是由于内部DefaultDateTimeFormat = "yyyy'-'MM'-
'dd'T'HH':'mm':'ss.FFFFFFFK"导致,⽽它也提供了修改⽇期样式的属性"DateTimeFormat",只要我们按照这种格式来写就OK了.
Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male",
DepartmentName = "Personnel Department", BirthDate = new DateTime(1982,2,12), EmploymentDate = new DateTime(2010,12,12) };            IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy'年'MM'⽉'dd'⽇'" };
string json = JsonConvert.SerializeObject(jack,dtConverter);
Console.WriteLine(json);
结果:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。