1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Newtonsoft.Json 序列化和反序列化 时间格式

Newtonsoft.Json 序列化和反序列化 时间格式

时间:2019-08-22 21:42:03

相关推荐

Newtonsoft.Json 序列化和反序列化 时间格式

web前端|js教程

Newtonsoft.Json,javascript,序列化

web前端-js教程

1.JSON序列化

短信平台软件源码,vscode 如何设置快捷,ubuntu卸载 ssr,tomcat服务版 内存,薄荷爬虫,php正则表达式匹配邮箱,seo推广营销平台分类,门户网站 jsp 下载,业务平台模板源码下载lzw

string JsonStr= JsonConvert.SerializeObject(Entity);

方维众筹源码 下载,vscode前端必备,ubuntu菜鸟,宝塔 tomcat 发布,sqlite3显示表,discuz插件怎么下载器,前端小程序项目怎么搭框架,爬虫软件看电视怎么下载,php内核深入,seo增长研究社,舞蹈网站源码,网页大图展示代码,dedecms上传模板lzw

eg:

深入php源码,vscode能不能编译,ubuntu cron日志,部分更新部署tomcat,学到爬虫巅峰,php常用单词,珠海市seo优化品牌,家政网站预约源码,织梦模板乙到一品资源网lzw

A a=new A();a.Name="Elain00";a.Hobby="eat eat";string jsonStr=JsonConvert.SerializeObject(a);

2.JSON反序列化

string jsonstr = “jsonString”;

Class model = JsonConvert.DeserializeObject(jsonstr);

eg:

string JsonStr=\"{\Name\:\Elaine00\,\Hobby\:\eat eat\}";A a=JsonConvert.DeserializeObject(JsonStr);

3.时间格式处理

IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; Response.Write(JsonConvert.SerializeObject(bll.GetModelList(strWhere), Newtonsoft.Json.Formatting.Indented, timeFormat));

4.扩展方法

public static class NewtonJSONHelper { public static string SerializeObject(this object obj) { return JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings{ReferenceLoopHandling = ReferenceLoopHandling.Ignore}); } public static T DeserializeObject(this string data) { return JsonConvert.DeserializeObject(data, new JsonSerializerSettings {ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); } }

5.日期处理

public class LogEntry{ public string Details { get; set; } public DateTime LogDate { get; set; }}public void WriteJsonDates(){ LogEntry entry = new LogEntry { LogDate = new DateTime(, 2, 15, 0, 0, 0, DateTimeKind.Utc), Details = "Application started." }; // default as of 4.5 string isoJson = JsonConvert.SerializeObject(entry); // {"Details":"Application started.","LogDate":"-02-15T00:00:00Z"} JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.Micro

public class LimitPropsContractResolver : DefaultContractResolver { private string[] props = null; public LimitPropsContractResolver(string[] props) { this.props = props; } protected override IList CreateProperties(Type type, MemberSerialization memberSerialization) { IList list = base.CreateProperties(type, memberSerialization); IsoDateTimeConverter iso = new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }; IList listWithConver = new List(); foreach (var item in list) {if (props.Contains(item.PropertyName)){ if (item.PropertyType.ToString().Contains("System.DateTime")) { item.Converter = iso; } listWithConver.Add(item);} } return listWithConver; } }}

softDateFormat }; string microsoftJson = JsonConvert.SerializeObject(entry, microsoftDateFormatSettings); // {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"} string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter()); // {"Details":"Application started.","LogDate":new Date(1234656000000)}}

2.JSON反序列化string jsonstr = "jsonString";Class model = JsonConvert.DeserializeObject(jsonstr);eg:string JsonStr=\"{\Name\:\Elaine00\,\Hobby\:\eat eat\}";A a=JsonConvert.DeserializeObject(JsonStr);

一般是对于值类型的处理,通过设置jSetting.DefaultValueHandling的值来确定,该值为枚举类型.

给成员设置默任值,用到”DefaultValue(value)”特性,当然别忘了引入命名空间”ponentModel”,假设员工的年龄默认值为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.忽略某些属性

首先介绍序列化的模式: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.支持非公共成员

序列化对象时,默认情况下仅仅序列化公有成员,如果想要非公有成员也被序列化,就要在该成员上加特性”JsonProperty”

5.日期处理

JsonConverters会在序列化和反序列化时被用到。JsonConverters允许手动对Json的控制。当Json的结构很复杂和你想改变一个类型怎么样被序列化时,这是非常有用的。当一个JsonConverters被添加到JsonSerializer时,它会检查每一要被序列化和反序列化的值,并返回CanConvert,如果为True,则JsonConverter读和写这个值;需要注意的是,虽然JsonConverter能够使你可以完全的控制Json的值,但是很多的序列化的特性被限制,像是类型名称和引用处理。所有的JsonConvert都在命名空间 “Newtonsoft.Json.Converters”下

5.1IsoDateTimeConverter 和 JavaScriptDateTimeConverter

这是中自带的两个处理日期的类,默认是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(,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(,12,12) }; string json = JsonConvert.SerializeObject(jack); Console.WriteLine(json);

结果:

5.2自定义日期格式

客户现在提出要求,希望得到的日期格式是符合中国人习惯的格式.要求返回的格式是”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(,12,12) }; IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy年MM月dd日\" }; string json = JsonConvert.SerializeObject(jack,dtConverter); Console.WriteLine(json);

结果:

6.FAQ

1.如何自定义序列化的字段名称?

默认情况下,序列化后结果中的字段名称和类中属性的名称一致.如果想自定义序列化后的字段名称,可以使用JsonProperty.例如:

public class Person { public int Id { get; set; } public string Name { get; set; } }

默认序列化的结果为: {“Id”:1,”Name”:”杨过”},如果不想用默认的字段名称,可以使用如下方式:

public class Person{ [JsonProperty(PropertyName = "PersonId")] public int Id { get; set; } [JsonProperty(PropertyName = "PersonName")] public string Name { get; set; }}

这样序列化的结果为:{“PersonId”:1,”PersonName”:”杨过”}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。