JSON.NET基本使用

序列化一个对象

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。

你可能感兴趣的:(.net)