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":"楊過"}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM