/* 注意部分 很重要 * * DataContractJsonSerializer在.NET Framework 3.5中引入, * 并且微软同时将JavaScriptSerializer打上了过时(obsolete)的标签,编译时就会有警告出现 * 而在.NET Framework 3.5 SP1中,微软又将JavaScriptSerializer的“过时”标签给去掉了 * * 如果一定要使用DataContractJsonSerializer,只有当为类加上[DataContract]属性, * 并且为需要序列化的属性加上[DataMember]后, * 使用DataContractJsonSerializer才可以生成干净、整洁的JSON数据。 * * 而当我们使用一些不能修改的类定义,如上面的Users类定义,我们没有权限去修改其定义, * 那么就可以使用JavaScriptSerializer去进行JSON序列化。 * * [Serializable] JavaScriptSerializer * * [DataContract] DataContractJsonSerializer * [DataMember] DataContractJsonSerializer * * [ScriptIgnore] JavaScriptSerializer * [IgnoreDataMember] DataContractJsonSerializer * [XmlIgnore] * * 如果一个类被标记为 [Serializable]而没标记为 [DataContract] * 那么 JavaScriptSerializer 序列化后 生成Json 字符串为类成员字段 * 而用 DataContractJsonSerializer 序列化后 生成Json并非成员名称字符串 * 并且此时可以用 [ScriptIgnore] [NonSerialized] * * JavaScriptSerializer:可以用 [ScriptIgnore] 忽略某些字段 属性 * {"UserID":1,"UserName":"******","UserEmail":"*****@*****.**","TestProperty":"TestPropertyValue"} * * DataContractJsonSerializer:[NonSerialized] 忽略某些字段 属性 * {"_testProperty":"TestPropertyValue","<UserEmail>k__BackingField":"*****@*****.**", * "<UserID>k__BackingField":1,"<UserName>k__BackingField":"Parry"} * * 如果一个类被标记为 [Serializable]而且同时标记为 [DataContract] * 那么 JavaScriptSerializer 序列化后 生成Json 字符串为类成员字段 * 而用 DataContractJsonSerializer 序列化后 生成Json并非成员名称字符串 * 并且此时可以用 [ScriptIgnore] [DataMember] * * JavaScriptSerializer:可以用 [ScriptIgnore] 忽略某些字段 属性 * {"UserID":1,"UserName":"******","UserEmail":"*****@*****.**","TestProperty":"TestPropertyValue"} * * DataContractJsonSerializer:[DataMember] 指定序列化哪些字段 属性 * {"UserID":1,"UserName":"******","UserEmail":"*****@*****.**"} * * 如果一个类没被标记为 [Serializable] 和 [DataContract] * 那么 JavaScriptSerializer DataContractJsonSerializer 序列化后 生成Json 字符串为类成员字段 * 此时可以用 [ScriptIgnore] [IgnoreDataMember] * * JavaScriptSerializer:可以用 [ScriptIgnore] 忽略某些字段 属性 * {"UserID":1,"UserName":"******","UserEmail":"*****@*****.**","TestProperty":"TestPropertyValue"} * * DataContractJsonSerializer:[IgnoreDataMember] 指定忽略某些字段 属性 * {"UserID":1,"UserName":"******","UserEmail":"*****@*****.**"} * * 总结如下: * * [Serializable] JavaScriptSerializer 常用搭配 * [ScriptIgnore] JavaScriptSerializer 上一条存在情况下 可用此标记指定序列字段属性 * * [DataContract] DataContractJsonSerializer 常用搭配 * [DataMember] DataContractJsonSerializer 上一条存在情况下 可用此标记指定序列字段属性 * [IgnoreDataMember] DataContractJsonSerializer 第一条不存在情况下 用此标记忽略不需要的字段属性 * * 参考文档: http://www.cnblogs.com/parry/archive/2012/12/04/diff_json_method.html * * [XmlIgnore] */ /// <summary> /// Json序列化,用于发送到客户端 /// </summary> /// <param name="item"></param> /// <param name="JavaScriptSerializer">是否使用JavaScriptSerializer</param> /// <returns></returns> public static string Serializer <T>(this T item, bool JavaScriptSerializer = true) { string JsonObjItem = string.Empty; if (JavaScriptSerializer) { JsonObjItem = JosonSerializer.Serializer(item); } else { //DataContractJsonSerializer在.NET Framework 3.5中引入, //并且微软同时将JavaScriptSerializer打上了过时(obsolete)的标签,编译时就会有警告出现 //而在.NET Framework 3.5 SP1中,微软又将JavaScriptSerializer的“过时”标签给去掉了 #region DataContractJsonSerializer //DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType()); //using (MemoryStream ms = new MemoryStream()) //{ // serializer.WriteObject(ms, item); // StringBuilder sb = new StringBuilder(); // //sb.Append(Encoding.Default.GetString(ms.ToArray())); // sb.Append(Encoding.UTF8.GetString(ms.ToArray())); // JsonObjItem = sb.ToString(); //} #endregion } return(JsonObjItem); }
///// <summary> ///// 对象转换为Json ///// </summary> ///// <param name="jsonObject">对象</param> ///// <returns>Json字符串</returns> //public static string ToJson(object jsonObject) //{ // string jsonString = "{"; // PropertyInfo[] propertyInfo = jsonObject.GetType().GetProperties(); // for (int i = 0; i < propertyInfo.Length; i++) // { // object objectValue = propertyInfo[i].GetGetMethod().Invoke(jsonObject, null); // string value = string.Empty; // if (objectValue is DateTime || objectValue is Guid || objectValue is TimeSpan) // { // value = "'" + objectValue.ToString() + "'"; // } // else if (objectValue is string) // { // value = "'" + ToJson(objectValue.ToString()) + "'"; // } // else if (objectValue is IEnumerable) // { // value = ToJson((IEnumerable)objectValue); // } // else // { // value = ToJson(objectValue.ToString()); // } // jsonString += "\"" + ToJson(propertyInfo[i].Name) + "\":" + value + ","; // } // jsonString.Remove(jsonString.Length - 1, jsonString.Length); // return jsonString + "}"; //} #endregion #region 对象转换为Json字符串 /// <summary> /// JavaScriptSerializer 序列化 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="item"></param> /// <param name="IsJavaScriptSerializer">默认true,false:DataContractJsonSerializer</param> /// <returns></returns> public static string ToJson <T>(this T item, bool IsJavaScriptSerializer = true) where T : new() { Type objType = item.GetType(); if (objType.Name == "Boolean" || objType.Name == "Int32") { return(item.ToJsons()); } else { return(JosonSerializer.Serializer <T>(item, IsJavaScriptSerializer)); } }