asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

asp.net JSON序列化与反序列化使用


发布日期:2018年11月09日
 
asp.net JSON序列化与反序列化使用

对JSON数据进行序列化和反序列化

可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串并将JSON字符串反序列化为类型实例  DataContractJsonSerializer在SystemRuntimeSerializationJson命名空间下NET Framework  包含在SystemServiceModelWebdll中需要添加对其的引用;NET Framework  在SystemRuntimeSerialization中

方法一引入SystemWebScriptSerialization命名空间使用  JavaScriptSerializer类实现简单的序列化序列化类Personnel

                        代码如下                                        public class  Personnel
            {
            public int Id { get; set; }
            public string Name { get; set; }
            }            

执行序列化反序列化

                        代码如下                                                   

protected  void Page_Load(object sender EventArgs e)
            {
            Personnel  personnel = new Personnel();
            personnelId = ;
            personnelName = "小白";

            

JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
            //执行序列化
            string r = jsonSerializerSerialize(personnel);

            

//执行反序列化
            Personnel _Personnel =  jsonSerializerDeserialize<Personnel>(r);
            }

            

                        

r输出结果{"Id":"Name":"小白"}

可以使用 ScriptIgnore属性标记不序列化公共属性或公共字段

                        代码如下                                        public class  Personnel
            {
            [ScriptIgnore]
            public int  Id { get; set; }
            public string Name { get; set; }
            }            

r输出结果{"Name":"小白"}

方法二引入 SystemRuntimeSerializationJson命名空间使用  DataContractJsonSerializer类实现序列化

序列化类People

                        代码如下                                                   

            

public class People
            {
            public int Id { get; set;  }
            public string Name { get; set; }
            }

                        

执行序列化反序列化

                        代码如下                                                   

protected  void Page_Load(object sender EventArgs e)
            {
            People  people = new People();
            peopleId = ;
            peopleName  = "小白";

            


            DataContractJsonSerializer json = new  DataContractJsonSerializer(peopleGetType());
            string szJson =  "";
            //序列化
            using (MemoryStream stream = new  MemoryStream())
            {
            jsonWriteObject(stream  people);
            szJson =  EncodingUTFGetString(streamToArray());
            }
            //反序列化
            using (MemoryStream ms = new  MemoryStream(EncodingUTFGetBytes(szJson)))
            {
            DataContractJsonSerializer serializer = new  DataContractJsonSerializer(typeof(People));
            People _people =  (People)serializerReadObject(ms);
            }
            }

            

                        

szJson输出结果{"Id":"Name":"小白"}

可以使用IgnoreDataMember:指定该成员不是数据协定的一部分且没有进行序列化DataMember:定义序列化属性参数使用DataMember属性标记字段必须使用DataContract标记类  否则DataMember标记不起作用

                        代码如下                                                   

            

[DataContract]
            public class People
            {
            [DataMember(Name =  "id")]
            public int Id { get; set; }
            [IgnoreDataMember]
            public string Name { get; set; }
            }

                        

输出结果: {"id":}

JSON序列化和反序列化日期时间的处理

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

修改Person类添加LastLoginTime

                        代码如下                                        public class  Person
            {
            public string Name { get; set; }
            public int Age { get; set; }
            public DateTime LastLoginTime { get;  set; }
            }
            Person p = new Person();
            pName = "张三";
            pAge = ;
            pLastLoginTime = DateTimeNow;
            string jsonString =  JsonHelperJsonSerializer<Person>(p);            

序列化结果

{"Age":"LastLoginTime":"/Date(+)/""Name":"张三"}

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

                        代码如下                                       
            using  System;
            using  SystemCollectionsGeneric;
            using  SystemLinq;
            using SystemWeb;
            using  SystemRuntimeSerializationJson;
            using SystemIO;
            using SystemText;
            using  SystemTextRegularExpressions;
            ///  <summary>
            ///  JSON序列化和反序列化辅助类
            ///  </summary>
            public class  JsonHelper
            {
            /// <summary>
            /// JSON序列化
            /// </summary>
            public static string  JsonSerializer<T>(T t)
            {
            DataContractJsonSerializer ser = new  DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new  MemoryStream();
            serWriteObject(ms  t);
            string jsonString =  EncodingUTFGetString(msToArray());
            msClose();
            //替换Json的Date字符串
            string p = @"\/Date((d+)+d+)\/";
            MatchEvaluator matchEvaluator = new  MatchEvaluator(ConvertJsonDateToDateString);
            Regex reg = new Regex(p);
            jsonString = regReplace(jsonString  matchEvaluator);
            return  jsonString;
            }
            /// <summary>
            /// JSON反序列化
            /// </summary>
            public static T  JsonDeserialize<T>(string jsonString)
            {
            //将"yyyyMMdd  HH:mm:ss"格式的字符串转为"/Date(+)/"格式
            string p =  @"d{}d{}d{}sd{}:d{}:d{}";
            MatchEvaluator matchEvaluator = new  MatchEvaluator(ConvertDateStringToJsonDate);
            Regex reg = new Regex(p);
            jsonString = regReplace(jsonString  matchEvaluator);
            DataContractJsonSerializer ser = new  DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new  MemoryStream(EncodingUTFGetBytes(jsonString));
            T obj = (T)serReadObject(ms);
            return obj;
            }
            /// <summary>
            ///  将Json序列化的时间由/Date(+)转为字符串
            /// </summary>
            private static string  ConvertJsonDateToDateString(Match m)
            {
            string result = stringEmpty;
            DateTime dt = new  DateTime();
            dt =  dtAddMilliseconds(longParse(mGroups[]Value));
            dt = dtToLocalTime();
            result = dtToString("yyyyMMdd  HH:mm:ss");
            return result;
            }
            /// <summary>
            /// 将时间字符串转为Json时间
            /// </summary>
            private static string  ConvertDateStringToJsonDate(Match m)
            {
            string result = stringEmpty;
            DateTime dt =  DateTimeParse(mGroups[]Value);
            dt = dtToUniversalTime();
            TimeSpan ts = dt   DateTimeParse("");
            result = stringFormat("\/Date({}+)\/"tsTotalMilliseconds);
            return result;
            }
            }            

序列化Demo

                        代码如下                                        Person p = new  Person();
            pName = "张三";
            pAge = ;
            pLastLoginTime = DateTimeNow;
            string jsonString =  JsonHelperJsonSerializer<Person>(p);            

运行结果

                        代码如下                                        {"Age":"LastLoginTime":" ::""Name":"张三"}
            反序列化Demo
            string json =  "{"Age":"LastLoginTime":" ::""Name":"张三"}";
            p=JsonHelperJsonDeserialize<Person>(json);                           

上一篇:asp.net利用NamingContainer属性获取GridView行号的方法

下一篇:asp.net后台cs中的JSON格式变量在前台Js中调用方法