.net 將List序列化成Json字符串


將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"
    };
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM