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

简介:

1.JSON序列化

string JsonStr= JsonConvert.SerializeObject(Entity);

eg:

复制代码
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<Class>(jsonstr);

eg:

string JsonStr='"{\'Name\':\'Elaine00\',\'Hobby\':\'eat eat\'}"; A a=JsonConvert.DeserializeObject<A>(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<T>(this string data)         {             return JsonConvert.DeserializeObject<T>(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(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc),     Details = "Application started."   };    // default as of Json.NET 4.5   string isoJson = JsonConvert.SerializeObject(entry);   // {"Details":"Application started.","LogDate":"2009-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<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)         {             IList<JsonProperty> list = base.CreateProperties(type, memberSerialization);             IsoDateTimeConverter iso = new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };             IList<JsonProperty> listWithConver = new List<JsonProperty>();             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<Class>(jsonstr);  eg:  string JsonStr='"{\'Name\':\'Elaine00\',\'Hobby\':\'eat eat\'}"; A a=JsonConvert.DeserializeObject<A>(JsonStr);
复制代码

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

DefaultValueHandling.Ignore 
序列化和反序列化时,忽略默认值
DefaultValueHandling.Include 
序列化和反序列化时,包含默认值

给成员设置默任值,用到"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.

OptOut 默认值,类中所有公有成员会被序列化,如果不想被序列化,可以用特性JsonIgnore
OptIn 默认情况下,所有的成员不会被序列化,类中的成员只有标有特性JsonProperty的才会被序列化,当类的成员很多,但客户端仅仅需要一部分数据时,很有用

假如客户仅仅需要员工的姓名,此时

复制代码
复制代码
    [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);
复制代码
复制代码

结果:

6.FAQ
1.如何自定义序列化的字段名称?
默认情况下,Json.Net序列化后结果中的字段名称和类中属性的名称一致.如果想自定义序列化后的字段名称,可以使用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":"杨过"}




本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/p/4383771.html,如需转载请自行联系原作者

相关文章
|
2天前
|
JSON 人工智能 算法
探索大型语言模型LLM推理全阶段的JSON格式输出限制方法
本篇文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
|
1月前
|
JSON JavaScript 前端开发
Go语言中json序列化的一个小坑,建议多留意一下
在Go语言开发中,JSON因其简洁和广泛的兼容性而常用于数据交换,但其在处理数字类型时存在精度问题。本文探讨了JSON序列化的一些局限性,并介绍了两种替代方案:Go特有的gob二进制协议,以及msgpack,两者都能有效解决类型保持和性能优化的问题。
53 7
|
1月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
41 4
|
1月前
|
JSON JavaScript Java
对比JSON和Hessian2的序列化格式
通过以上对比分析,希望能够帮助开发者在不同场景下选择最适合的序列化格式,提高系统的整体性能和可维护性。
47 3
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
JSON Java 数据格式
springboot中表字段映射中设置JSON格式字段映射
springboot中表字段映射中设置JSON格式字段映射
141 1
|
29天前
|
XML JSON Kubernetes
什么是 YAML?:一种简洁高效的数据序列化格式
什么是 YAML?:一种简洁高效的数据序列化格式
117 0
|
1月前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。

热门文章

最新文章