zoukankan      html  css  js  c++  java
  • .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"
        };
    }
    复制代码

     转载:https://www.cnblogs.com/ericli-ericli/p/5857407.html

  • 相关阅读:
    PHP数组(数组正则表达式、数组、预定义数组)
    面向对象。OOP三大特征:封装,继承,多态。 这个讲的是【封存】
    uvalive 3938 "Ray, Pass me the dishes!" 线段树 区间合并
    LA4329 Ping pong 树状数组
    HDU 1257 最少拦截系统
    HDU 1260 Tickets
    codeforce 621D
    codeforce 621C Wet Shark and Flowers
    codeforce 621B Wet Shark and Bishops
    codeforce 621A Wet Shark and Odd and Even
  • 原文地址:https://www.cnblogs.com/yuanmo/p/10045467.html
Copyright © 2011-2022 走看看