序列化一个对象
public static string ToJson( object obj) { string json = JsonConvert .SerializeObject(obj); return json; }
反序列化一个字符串到对象
string json = @"{ ""Name"": ""Apple"", ""Expiry"": new Date(1230422400000), ""Price"": 3.99, ""Sizes"": [ ""Small"", ""Medium"", ""Large"" ] }"; JObject o = JObject.Parse(json); string name = (string)o["Name"]; // Apple JArray sizes = (JArray)o["Sizes"]; string smallest = (string)sizes[0]; // Small
json.net中的时间处理
json序列化DateTime对象时,输入的格式是这样的 /Date(1377853149258+0800)/ 。可读性不好,使用开源库Json.Net时可以解决这一问题。
使用Json.Net的默认序列化输入也是/Date(1377853149258+0800)/ 。但Json.Net提供了2个JsonConverter,可以对时间进行格式化输出:IsoDateTimeConverter 和JavaScriptDateTimeConverter 。
如果对这2个converter的输出还不满意,可以自定义时间的格式化输出。如下是代码示例:
public class TestClass { public string Name { get; set; } public DateTime Date { get; set; } } public class class1 { public void Test001() { TestClass obj = new TestClass() { Name = "name", Date = DateTime.Now }; //标准格式 Console.WriteLine(JsonConvert.SerializeObject(obj)); //isoDateTime格式格式 Console.WriteLine(JsonConvert.SerializeObject(obj, new IsoDateTimeConverter())); //JavaScriptDateTime格式 Console.WriteLine(JsonConvert.SerializeObject(obj, new JavaScriptDateTimeConverter())); //自定义时间格式 IsoDateTimeConverter iso = new IsoDateTimeConverter(); iso.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.ffff"; Console.WriteLine(JsonConvert.SerializeObject(obj, iso)); } }
------ Test started: Assembly: Alibaba.Outsource.Domain.Application.Tests.dll ------
{"Name":"name","Date":"/Date(1377853149258+0800)/"}
{"Name":"name","Date":"2013-08-30T16:59:09.2583668+08:00"}
{"Name":"name","Date":new Date(1377853149258)}
{"Name":"name","Date":"2013-08-30 16:59:09.2583"}
1 passed, 0 failed, 0 skipped, took 0.32 seconds (Ad hoc).
如下是反序列化过程:
public void Test002() { TestClass obj = new TestClass() { Name = "name", Date = DateTime.Now }; //标准格式 string defaultString = JsonConvert.SerializeObject(obj); //Console.WriteLine(defaultString); //isoDateTime格式格式 string isoString = JsonConvert.SerializeObject(obj, new IsoDateTimeConverter()); //Console.WriteLine(isoString); //JavaScriptDateTime格式 string javaScriptString = JsonConvert.SerializeObject(obj, new JavaScriptDateTimeConverter()); //Console.WriteLine(javaScriptString); //自定义时间格式 IsoDateTimeConverter iso = new IsoDateTimeConverter(); iso.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.ffff"; string customString = JsonConvert.SerializeObject(obj, iso); Console.WriteLine(customString); //参数中带JsonConverter TestClass obj2 = JsonConvert.DeserializeObject<TestClass>(customString, iso); Console.WriteLine(obj2.Name); Console.WriteLine(obj2.Date); //参数中不带JsonConverter TestClass obj3 = JsonConvert.DeserializeObject<TestClass>(customString); Console.WriteLine(obj3.Name); Console.WriteLine(obj3.Date); }
输出:当时间格式是yyyy-MM-dd HH:mm:ss.ffff时,参数中带和不带jsonConverter都是可以成功序列化的
------ Test started: Assembly: Alibaba.Outsource.Domain.Application.Tests.dll ------
{"Name":"name","Date":"2013-08-30 17:12:47.5933"}
name
2013/8/30 17:12:47
name
2013/8/30 17:12:47
1 passed, 0 failed, 0 skipped, took 0.36 seconds (Ad hoc).
那是不是所有的自定义时间格式,在反序列化时,都可以不用带JsonConverter呢?答案是否定的。
针对下面的2中自定义时间格式,如果反序列化时,参数中不带上我们自定义的JsonConverter,第一个是可以的。第二个是不行的。当反序列化第二个时,会抛出异常。
iso2.DateTimeFormat = "yyyy年MM月dd日 HH时mm分ss秒";//可以正常反序列化
iso3.DateTimeFormat = "yyyy年哈哈MM月哈哈dd日哈哈 HH哈哈mm哈哈ss哈哈" ;//反序列化时抛出异常
可见,如果自定义的时间格式,刚好是C#可以解析的标准格式,那么可以在反序列化的时候,不用加上自定义Converter。否则,需要加上Converter。