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。

原文地址:https://www.cnblogs.com/leiwei/p/3439611.html