using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System; using System.Data; namespace GTech.Solution.Api.Common { #region 一.忽略某些属性 /// 一.忽略某些属性 /// OptIn 默认情况下, 所有的成员不会被序列化, 类中的成员只有标有特性JsonProperty的才会被序列化, 当类的成员很多, 但客户端仅仅需要一部分数据时, 很有用 /// [JsonObject(MemberSerialization.OptIn)] /// public class Person /// { /// public int Age { get; set; } /// [JsonProperty] /// public string Name { get; set; } /// } /// Person p = new Person { Age = 10, Name = "Gary"}; /// result: {"Name":"Gary"} /// /// OptOut 默认值, 类中所有公有成员会被序列化, 如果不想被序列化, 可以用特性JsonIgnore /// [JsonObject(MemberSerialization.OptOut)] /// public class Person /// { /// public int Age { get; set; } /// [JsonIgnore] /// public string Name { get; set; } /// } /// Person p = new Person { Age = 10, Name = "Gary"}; /// result: {"Age":"10"} #endregion #region 二.默认值处理 /// 二.默认值处理 /// 序列化时想忽略默认值属性可以通过JsonSerializerSettings.DefaultValueHandling来确定,该值为枚举值 /// DefaultValueHandling.Ignore 序列化和反序列化时, 忽略默认值 /// DefaultValueHandling.Include 序列化和反序列化时, 包含默认值 /// [JsonObject(MemberSerialization.OptIn)] /// public class Person /// { /// [DefaultValue(10)] /// public int Age { get; set; } /// [JsonProperty] /// public string Name { get; set; } /// } /// Person p = new Person { Age = 10, Name = "Gary", Sex = "Man", IsMarry = false, Birthday = new DateTime(1991, 1, 2) }; /// result: {"Name":"Gary","Sex":"Man","Birthday":"1991-01-02T00:00:00"} #endregion #region 三.空值的处理 /// 三.空值的处理 /// 序列化时需要忽略值为NULL的属性,可以通过JsonSerializerSettings.NullValueHandling来确定, /// 另外通过JsonSerializerSettings设置属性是对序列化过程中所有属性生效的, /// 想单独对某一个属性生效可以使用JsonProperty,下面将分别展示两个方式 /// [JsonObject(MemberSerialization.OptIn)] /// public class Person /// { /// [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] //Must set this attibute, otherwise throw exception. /// public Room room { get; set; } /// [JsonProperty] /// public int Age { get; set; } /// [JsonProperty] /// public string Name { get; set; } /// } /// Person p = new Person { room = NULL,Age = 10, Name = "Gary"}; /// result: {"Age":"10","Name":"Gary"} #endregion #region 四.支持非公共成员 /// 四.支持非公共成员 /// 序列化时默认都是处理公共成员,如果需要处理非公共成员,就要在该成员上加特性"JsonProperty" /// [JsonObject(MemberSerialization.OptIn)] /// public class Person /// { /// [JsonProperty] /// public int Age { get; set; } /// [JsonProperty] /// public string Name { get; set; } /// [JsonProperty] /// private int Height { get; set; } /// } /// Person p = new Person {Age = 10, Name = "Gary",Height = "100.1"}; /// result: {"Age":"10","Name":"Gary","Height":"100.1"} #endregion #region 五.日期处理 /// 五.日期处理 /// 对于Dateime类型日期的格式化就比较麻烦了,系统自带的会格式化成iso日期标准, /// 但是实际使用过程中大多数使用的可能是yyyy-MM-dd 或者yyyy-MM-dd HH:mm:ss两种格式的日期, /// 解决办法是可以将DateTime类型改成string类型自己格式化好,然后在序列化。 /// 如果不想修改代码,可以采用下面方案实现。 /// Json.Net提供了IsoDateTimeConverter日期转换这个类,可以通过JsnConverter实现相应的日期转换 /// [JsonConverter(typeof(IsoDateTimeConverter))] /// public DateTime Birthday { get; set; } /// 但是IsoDateTimeConverter日期格式不是我们想要的,我们可以继承该类实现自己的日期 /// public class ChinaDateTimeConverter : DateTimeConverterBase /// { /// private static IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" }; /// public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) /// { /// return dtConverter.ReadJson(reader, objectType, existingValue, serializer); /// } /// public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) /// { /// dtConverter.WriteJson(writer, value, serializer); /// } /// } /// [JsonConverter(typeof(ChinaDateTimeConverter))] /// public DateTime Birthday { get; set; } /// /// [JsonObject(MemberSerialization.OptIn)] /// public class Person /// { /// [JsonProperty] /// public int Age { get; set; } /// [JsonProperty] /// public string Name { get; set; } /// [JsonProperty] /// private int Height { get; set; } /// [JsonConverter(typeof(ChinaDateTimeConverter))] /// public DateTime Birthday { get; set; } /// } /// Person p = new Person {Age = 10, Name = "Gary",Height = "100.1", Birthday = Birthday = new DateTime(1991, 1, 2)}; /// result: {"Age":"10","Name":"Gary","Height":"100.1","Birthday":"1991-01-02-00-00-00"} #endregion public class JsonNetExt { #region Serialization public static string DataTableToJson(DataTable dt) { return JsonConvert.SerializeObject(dt); } public static string EntityToJson(T Entity) { return JsonConvert.SerializeObject(Entity); } public static string EntityToJsonIgnoreDefaultValue(T Entity) { JsonSerializerSettings jsetting = new JsonSerializerSettings(); jsetting.DefaultValueHandling = DefaultValueHandling.Ignore; return JsonConvert.SerializeObject(Entity, Formatting.Indented, jsetting); } public static string EntityToJsonIgnoreNULL(T Entity) { JsonSerializerSettings jsetting = new JsonSerializerSettings(); jsetting.NullValueHandling = NullValueHandling.Ignore; return JsonConvert.SerializeObject(Entity, Formatting.Indented, jsetting); } public static string EntityToJsonIgnoreNULLAndDefaultValue(T Entity) { JsonSerializerSettings jsetting = new JsonSerializerSettings(); jsetting.NullValueHandling = NullValueHandling.Ignore; jsetting.DefaultValueHandling = DefaultValueHandling.Ignore; return JsonConvert.SerializeObject(Entity, Formatting.Indented, jsetting); } #endregion #region Deserialization public static DataTable JsonToDataTable(string dataTableJsonString) { return JsonConvert.DeserializeObject(dataTableJsonString); } public static T JsonToEntity(string entityJsonString) { return JsonConvert.DeserializeObject(entityJsonString); } #endregion } /// /// User defined time converter for convert to json string /// public class ChinaDateTimeConverter : DateTimeConverterBase { private static IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd-hh-mm-ss" }; public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return dtConverter.ReadJson(reader, objectType, existingValue, serializer); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { dtConverter.WriteJson(writer, value, serializer); } } /// /// MemberSerialization.OptOut: OptOut 默认值, 类中所有公有成员会被序列化, 如果不想被序列化, 可以用特性JsonIgnore /// MemberSerialization.OptOut: OptIn 默认情况下, 所有的成员不会被序列化, 类中的成员只有标有特性JsonProperty的才会被序列化, 当类的成员很多, 但客户端仅仅需要一部分数据时, 很有用 /// [JsonObject(MemberSerialization.OptIn)] public class JsonNetExtDemoPerson { /// /// JsonProperty(NullValueHandling = NullValueHandling.Ignore): ignore null value properties /// [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public object Data { get; set; } /// /// JsonIgnore: When converting ,Ignore this property /// [JsonIgnore] public int Age { get; set; } /// /// JsonProperty: When converting via MemberSerialization.OptIn, if include this property, must use this attribute. /// [JsonProperty] public string Name { get; set; } /// /// JsonProperty: if need private properties, must add this attribute /// [JsonProperty] private int Height { get; set; } /// /// ChinaDateTimeConverter: Use time converter, set time format by user. /// [JsonConverter(typeof(ChinaDateTimeConverter))] public DateTime Birthday { get; set; } /// /// StringEnumConverter: make "Type":"1" to "Type":"Mail" /// [JsonConverter(typeof(StringEnumConverter))] public JsonNetExtDemoNotifyType Type { get; set; } } public enum JsonNetExtDemoNotifyType { Mail = 0, SMS = 1 } }