將List類型轉化為Json,是我們平常開發時最常見的了。在使用中,有很多種方法,也可以使用。
第一種 第三方組件:Newtonsoft.Json.dll
//轉化成Json Newtonsoft.Json.JsonConvert.SerializeObject(obj); //反序列化 Newtonsoft.Json.JsonConvert.DeserializeObject<T>(string);
注意:版本更新時,可能會遇到問題:
因為引用出了問題,在程序集里面找不到的Newtonsoft.Json,所以它就拿從系統盤里面預裝的舊版的來用。
結果就報版本錯誤了。
web.config 里面注明了
<dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly>
就要求用6.*版本的了。
這時,可以刪除bin文件夾里面的Newtonsoft.Json,重新用nuget 引用一遍。
也用記事本打開項目文件(*.csproj)可以找到在這個文件中,有兩處Newtonsoft.Json的引用,刪掉老版本的引用就好了。
網上看了下,具體問題的可能的三個原因:
第一,引用不存在vs自動找到舊版的。
第二,web.config配置的版本號跟實際想要版本號不對。
第三,bin文件夾里面的根本就是舊版的。
第二種,微軟自帶的組件:System.Runtime.Serialization.dll
使用方式,新建個工具類,然后調用:
public class SerializerHelper { /// <summary> /// JSON序列化 /// </summary> public static string JsonSerializer<T>(T t) { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); using (MemoryStream ms = new MemoryStream()) { ser.WriteObject(ms, t); return Encoding.UTF8.GetString(ms.ToArray()); } } /// <summary> /// JSON反序列化 /// </summary> public static T JsonDeserialize<T>(string jsonString) { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString))) { return (T)ser.ReadObject(ms); } } }
第三種:微軟自帶組件System.Web.Extensions.dll(JavaScriptSerializer 類)
屬性:
MaxJsonLength 獲取或設置 JavaScriptSerializer 類接受的 JSON 字符串的最大長度。
RecursionLimit 獲取或設置用於約束要處理的對象級別的數目的限制。
方法:
ConvertToType<(Of <(T>)>) 將給定對象轉換為指定類型。
Deserialize<(Of <(T>)>) 將指定的 JSON 字符串轉換為 T 類型的對象。
DeserializeObject 將指定的 JSON 字符串轉換為對象圖。
RegisterConverters 使用 JavaScriptSerializer 實例注冊自定義轉換器。
Serialize 已重載。 將對象轉換為 JSON 字符串。
注意:
DateTime 類型 Date 對象,在 JSON 中表示為“\/Date(刻度數)\/”。刻度數是一個正的或負的長值,該值指示從 UTC 1970 年 1 月 1 日午夜開始已經過的刻度數(毫秒)。
MaxJsonLength限制了被反序列化和序列化生成的JSON字符串的長度,默認值位為2097152(0x200000,等同於 4 MB 的 Unicode 字符串數據)。
RecursionLimit用於設置被序列化對象和反序列化生成對象結構的允許的層級數,默認值為100。
第四種:MVC 的Controller 中的 return Json(Obj,JsonRequestBehavior.AllowGet)
System.Web.Mvc.JsonResult 對象,該對象使用指定 JSON 請求行為將指定對象序列化為 JavaScript 對象表示法。
出於對安全的考慮,JsonResult在默認的情況下不能作為對HTTP-GET請求的響應,在這種情況下並會直接拋出一個InvalidOperationException異常。我們可以通過它的JsonRequestBehavior屬性開啟JsonResult對HTTP-GET請求的支持。該屬性類型號
為JsonRequestBehavior枚舉,兩個枚舉項AllowGet和DenyGet分別表示允許/拒絕支持對HTTP-GET請求的響應。JsonResult的JsonRequestBehavior屬性在初始化的時候被設置為DenyGet。
但是他有一個致命的缺陷,大小不好設置,當obj足夠大時,就會報錯:使用JSON JavaScriptSerializer進行序列化或反序列化時出錯。字符串的長度超過了為maxJsonLength屬性設置的值。
解決辦法:.net 使用Json(),maxJsonLength屬性設置的值問題 其實最佳的方案就是使用了上面的第三種 JavaScriptSerializer 類的MaxJsonLength 屬性。
public ActionResult GetLargeJsonResult() { return new ContentResult { Content = new JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(listResult), ContentType = "application/json" }; }