• .net中使用JSON


    在.NET使用JSON作为数据交换格式

    ASP.NET中JSON的序列化和反序列化

    三种方式:

    使用System.Web.Script.Serialization.JavaScriptSerializer类
    System.Web.Script.Serialization.JavaScriptSerializer 类是.NET类库中自带的一种JSON序列化实现,在.NET Framework3.5及以后版本中可以使用这个类,这个类位于System.Web.Extensions.dll中,使用这个类是必须添加对这个 dll的引用。
    下面的代码是使用JavaScriptSerializer进行序列化和反序列化的例子:

    C#代码  收藏代码
    1. public static void JavaScriptSerializerDemo()  
    2. {  
    3.     User user = new User { UserId = 1, UserName = "李刚", CreateDate = DateTime.Now.AddYears(-30),Birthday=DateTime.Now.AddYears(-50), Priority = Priority.Highest, Salary = 500000 };  
    4.     //JavaScriptSerializer类在System.Web.Extensions.dll中,注意添加这个引用  
    5.     JavaScriptSerializer serializer = new JavaScriptSerializer();  
    6.     //JSON序列化  
    7.     string result=serializer.Serialize(user);  
    8.     Console.WriteLine("使用JavaScriptSerializer序列化后的结果:{0},长度:{1}", result, result.Length);  
    9.     //JSON反序列化  
    10.     user = serializer.Deserialize<User>(result);  
    11.     Console.WriteLine("使用JavaScriptSerializer反序列化后的结果:UserId:{0},UserName:{1},CreateDate:{2},Priority:{3}", user.UserId, user.UserName, user.CreateDate, user.Priority);  
    12.   
    13. }  

     使用System.Runtime.Serialization.Json.DataContractJsonSerializer类
    System.Runtime.Serialization.Json.DataContractJsonSerializer 类位于System.ServiceModel.Web.dll中,使用这个类时除了需要添加对System.ServiceModel.Web.dll 的引用之外,还需要添加System.Runtime.Serialization.dll的引用,注意这个类也是在.NET Framework3.5及以后版本中可以使用。

    使用Newtonsoft.Json.JsonConvert类
    Newtonsoft.Json.JsonConvert类是非微软提供的一个JSON序列化和反序列的开源免费的类库(下载网址是:http://www.codeplex.com/json/), 它提供了更灵活的序列化和反序列化控制,并且如果你的开发环境使用的是.NET Framework3.5及以后版本的话,你就可以使用Linq to JSON,这样一来面对一大段的数据不必一一解析,你可以使用Linq to JSON解析出你关心的那部分即可,非常方便。

    JSON序列化和反序列化后的日期处理:

         JSON格式不直接支持日期和时间。DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,其中第一个数字(在提 供的示例中为 700000)是 GMT 时区中自 1970 年 1 月 1 日午夜以来按正常时间(非夏令时)经过的毫秒数。该数字可以是负数,以表示之前的时间。示例中包括“+0500”的部分可选,它指示该时间属于Local 类型,即它在反序列化时应转换为本地时区。如果没有该部分,则会将时间反序列化为Utc。

         修改Person类,添加LastLoginTime:

       1: public class Person
       2: {
       3:     public string Name { get; set; }
       4:     public int Age { get; set; }
       5:     public DateTime LastLoginTime { get; set; }
       6: }
       1: Person p = new Person();   2: p.Name = "张三";
       3: p.Age = 28;
       4: p.LastLoginTime = DateTime.Now;
       5:  
       6: string jsonString = JsonHelper.JsonSerializer<Person>(p);

         序列化结果:

    {"Age":28,"LastLoginTime":"/Date(1294499956278+0800)/","Name":"张三"}
     

         1 、在后台使用正则表达式对其替换处理。修改JsonHelper:

       1: using System;
       2: using System.Collections.Generic;
       3: using System.Linq;
       4: using System.Web;
       5: using System.Runtime.Serialization.Json;
       6: using System.IO;
       7: using System.Text;
       8: using System.Text.RegularExpressions;
       9:  
      10: /// <summary>
      11: /// JSON序列化和反序列化辅助类
      12: /// </summary>
      13: public class JsonHelper
      14: {
      15:     /// <summary>
      16:     /// JSON序列化
      17:     /// </summary>
      18:     public static string JsonSerializer<T>(T t)
      19:     {
      20:         DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
      21:         MemoryStream ms = new MemoryStream();
      22:         ser.WriteObject(ms, t);
      23:         string jsonString = Encoding.UTF8.GetString(ms.ToArray());
      24:         ms.Close();
      25:         //替换Json的Date字符串
      26:         string p = @"\/Date((d+)+d+)\/";
      27:         MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
      28:          Regex reg = new Regex(p);
      29:         jsonString = reg.Replace(jsonString, matchEvaluator);
      30:         return jsonString;
      31:     }
      32:  
      33:     /// <summary>
      34:     /// JSON反序列化
      35:     /// </summary>
      36:     public static T JsonDeserialize<T>(string jsonString)
      37:     {
      38:         //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"/Date(1294499956278+0800)/"格式
      39:         string p = @"d{4}-d{2}-d{2}sd{2}:d{2}:d{2}";
      40:         MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
      41:         Regex reg = new Regex(p);
      42:         jsonString = reg.Replace(jsonString, matchEvaluator);
      43:         DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
      44:         MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
      45:         T obj = (T)ser.ReadObject(ms);
      46:         return obj;
      47:     }
      48:  
      49:     /// <summary>
      50:     /// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串
      51:     /// </summary>
      52:     private static string ConvertJsonDateToDateString(Match m)
      53:     {
      54:         string result = string.Empty;
      55:         DateTime dt = new DateTime(1970,1,1);
      56:         dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
      57:         dt = dt.ToLocalTime();
      58:         result = dt.ToString("yyyy-MM-dd HH:mm:ss");
      59:         return result;
      60:     }
      61:  
      62:     /// <summary>
      63:     /// 将时间字符串转为Json时间
      64:     /// </summary>
      65:     private static string ConvertDateStringToJsonDate(Match m)
      66:     {
      67:         string result = string.Empty;
      68:         DateTime dt = DateTime.Parse(m.Groups[0].Value);
      69:         dt = dt.ToUniversalTime();
      70:         TimeSpan ts = dt - DateTime.Parse("1970-01-01");
      71:         result = string.Format("\/Date({0}+0800)\/",ts.TotalMilliseconds);
      72:         return result;
      73:     }
      74: }

           序列化Demo:

       1: Person p = new Person();
       2: p.Name = "张三";
       3: p.Age = 28;
       4: p.LastLoginTime = DateTime.Now;
       5:  
       6: string jsonString = JsonHelper.JsonSerializer<Person>(p);

           运行结果:

    {"Age":28,"LastLoginTime":"2011-01-09 01:00:56","Name":"张三"}

           反序列化Demo:

    string json = "{"Age":28,"LastLoginTime":"2011-01-09 00:30:00","Name":"张三"}";
    p=JsonHelper.JsonDeserialize<Person>(json);

            运行结果:

    image

         在后台替换字符串适用范围比较窄,如果考虑到全球化的有多种语言还会更麻烦。

         2、利用JavaScript处理

       1: function ChangeDateFormat(jsondate) {
       2:     jsondate = jsondate.replace("/Date(", "").replace(")/", "");
       3:     if (jsondate.indexOf("+") > 0) {
       4:         jsondate = jsondate.substring(0, jsondate.indexOf("+"));
       5:     }
       6:     else if (jsondate.indexOf("-") > 0) {
       7:         jsondate = jsondate.substring(0, jsondate.indexOf("-"));
       8:     }
       9:  
      10:     var date = new Date(parseInt(jsondate, 10));
      11:     var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
      12:     var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
      13:     return date.getFullYear() + "-" + month + "-" + currentDate;
      14: }

          简单Demo :

    ChangeDateFormat("/Date(1294499956278+0800)/");

         结果:

    2011-1-8
  • 相关阅读:
    Visual Studio中View页面与Js页面用快捷键互相跳转
    使用NLog记录业务日志到数据库
    Js笛卡尔乘积
    多线程更新一个表里面的不同行也可能会死锁
    当请求参数与网站编码不一致时乱码解决方法
    WIN7下vs2010滑轮滚动不正确的解决方法
    VS 2017 代码报错编译正常
    C#表达式树
    .net core 学习 读取配置文件
    .net core 上传文件Demo
  • 原文地址:https://www.cnblogs.com/chuhj/p/7119599.html
Copyright © 2020-2023  润新知