zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    MySQL:逻辑库与表管理
    MySQL:初识数据库
    MySQL:安装与配置
    C语言之指针
    C语言之二维数组
    C语言之冒泡排序
    C语言之数组
    C语言之函数的声明
    C语言之带有返回值的函数
    C语言之全局变量和局部变量
  • 原文地址:https://www.cnblogs.com/leiwei/p/3439611.html
Copyright © 2011-2022 走看看