• .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"
        };
    }
  • 相关阅读:
    ASP.NET中的DataBinder.Eval用法
    jquery Ajax调用asmx和ashx代码示例三级联动
    项目中使用的架构
    asp.net(c#)上传图片到数据库
    asp.net(c#)从数据库里读取图片并显示到页面
    一款好的UI草图设计软件
    Windows Azure云平台(无须提供信用卡)[转]
    推荐8个超棒的学习 jQuery 的网站
    推荐两个界面原型设计工具GUIDesignStudio 和 Mockups For Desktop
    在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)
  • 原文地址:https://www.cnblogs.com/ericli-ericli/p/5857407.html
Copyright © 2020-2023  润新知