先不废话,直接上代码

Asp.net MVC自带Json序列化

 /// <summary>
/// 加载组件列表
/// </summary>
/// <param name="departmentId">作业部/厂</param>
/// <param name="unitId">组件Id</param>
/// <param name="tag">标签号</param>
/// <param name="pageIndex">当前页码</param>
/// <param name="pageSize">每页条数</param>
/// <returns>返回组件json数据</returns>
public JsonResult ListCom(long departmentId, IEnumberable<long> unitIds, string tag, int pageIndex, int pageSize)
{
var dataEntity = LdarService.ListCom(unitIds, tag, pageIndex + , pageSize);
var dataModel = new Page<LdComModel> {Total = dataEntity.Total};
var data =
dataModel.DataList =
dataEntity.DataList.Select(model => Builder.Builder.Convert<LdComModel>(new object[] {model}));//Entity转ViewModel
dataModel.DataList = data;
return Json(new {
msg = CommonModelBuilder.BuildQuerySuccessMessage("组件信息维护", (int) dataModel.Total),
data = dataModel.DataList,
total = dataModel.Total
});
}
显示到前台界面

接收到的报文中有很多导航属性,前台并不需要这些属性.

LdComModel类中关联了很多外表,也就是导航属性,导航也被序列化,这样不科学,会将所有属性包括导航属性都序列化,还可能会造成循环引用,导致报错。
我只想序列需要的字段,这时可以手写一个匿名类
 var data=new {
model.AreaName,
model.AreaId,
......
};

这么写字段少还好,字段多就很不爽吧。

这时我们可以用Json.Net序列化,首先引用newtonsoft.json.dll,使用nuget引用比较方便。在不想序列化的属性上打上[JsonIgnore]特性,序列化就会被忽略。

LdComModel类中的部分代码
 /// <summary>
/// 分区
/// </summary>
[JsonIgnore]
public LdAreaModel LdAreaModel { get; set; } /// <summary>
/// 区域名称
/// </summary>
public string AreaName
{
get
{
return LdAreaModel.LdarAreaName;
}
}

使用JsonNet序列化

 /// <summary>
/// 加载组件列表
/// </summary>
/// <param name="departmentId">作业部/厂</param>
/// <param name="unitId">组件Id</param>
/// <param name="tag">标签号</param>
/// <param name="pageIndex">当前页码</param>
/// <param name="pageSize">每页条数</param>
/// <returns>返回组件json数据</returns>
public JsonResult ListCom(long departmentId, IEnumberable<long> unitIds, string tag, int pageIndex, int pageSize)
{
var dataEntity = LdarService.ListCom(unitIds, tag, pageIndex + , pageSize);
var dataModel = new Page<LdComModel> {Total = dataEntity.Total};
var data =
dataModel.DataList =
dataEntity.DataList.Select(model => Builder.Builder.Convert<LdComModel>(new object[] {model}));//Entity转ViewModel
dataModel.DataList = data;
var result = new JsonNetResult()
{
Data = new
{
msg = CommonModelBuilder.BuildQuerySuccessMessage("组件信息维护", (int) dataModel.Total),
data = dataModel.DataList,
total = dataModel.Total
}
};
return result;
}

这时返回到前台的json中没有多余的导航属性.

导航属性没有被序列化,速度也快了很多。

这样写,虽然可以实现功能,很每次都要new一个JsonNetResult对象,写起来很是不爽,能不能给Controller写个扩展方法,像Json(...)一样直接写JsonNet(...)?

Controller中Json(...)方法的部分源码

     /// <summary>
/// 创建一个将指定对象序列化为 JavaScript 对象表示法 (JSON) 的 <see cref="T:System.Web.Mvc.JsonResult"/> 对象。
/// </summary>
///
/// <returns>
/// 将指定对象序列化为 JSON 格式的 JSON 结果对象。在执行此方法所准备的结果对象时,ASP.NET MVC 框架会将该对象写入响应。
/// </returns>
/// <param name="data">要序列化的 JavaScript 对象图。</param>
protected internal JsonResult Json(object data)
{
return this.Json(data, (string) null, (Encoding) null, JsonRequestBehavior.DenyGet);
} // <summary>
/// 创建 <see cref="T:System.Web.Mvc.JsonResult"/> 对象,该对象使用内容类型、内容编码和 JSON 请求行为将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式。
/// </summary>
///
/// <returns>
/// 将指定对象序列化为 JSON 格式的结果对象。
/// </returns>
/// <param name="data">要序列化的 JavaScript 对象图。</param><param name="contentType">内容类型(MIME 类型)。</param><param name="contentEncoding">内容编码。</param><param name="behavior">JSON 请求行为</param>
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonResult()
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}

我们可以仿照Controller中的源码,自己给Controller写个扩展方法JsonNet(...)

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web; namespace System.Web.Mvc
{
public static class ControllerExt
{
/// <summary>
/// 创建一个将指定对象序列化为 JavaScript 对象表示法 (JSON) 的 <see cref="T:System.Web.Mvc.JsonNetResult"/> 对象。
/// </summary>
///
/// <returns>
/// 将指定对象序列化为 JSON 格式的 JSON 结果对象。在执行此方法所准备的结果对象时,ASP.NET MVC 框架会将该对象写入响应。
/// </returns>
/// <param name="controller">控件器</param>
/// <param name="data">要序列化的 JavaScript 对象图。</param>
public static JsonNetResult JsonNet(this Controller controller, object data)
{
return JsonNet(data, (string) null, (Encoding) null, JsonRequestBehavior.DenyGet);
} /// <summary>
/// 创建一个将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式的 <see cref="T:System.Web.Mvc.JsonNetResult"/> 对象。
/// </summary>
///
/// <returns>
/// 将指定对象序列化为 JSON 格式的 JSON 结果对象。
/// </returns>
/// <param name="controller">控件器</param>
/// <param name="data">要序列化的 JavaScript 对象图。</param>
/// <param name="contentType">内容类型(MIME 类型)。</param>
public static JsonNetResult JsonNet(this Controller controller, object data, string contentType)
{
return JsonNet(data, contentType, (Encoding) null, JsonRequestBehavior.DenyGet);
} /// <summary>
/// 创建一个将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式的 <see cref="T:System.Web.Mvc.JsonNetResult"/> 对象。
/// </summary>
///
/// <returns>
/// 将指定对象序列化为 JSON 格式的 JSON 结果对象。
/// </returns>
/// <param name="controller">控件器</param>
/// <param name="data">要序列化的 JavaScript 对象图。</param>
/// <param name="contentType">内容类型(MIME 类型)。</param>
/// <param name="contentEncoding">内容编码。</param>
public static JsonNetResult JsonNet(this Controller controller, object data, string contentType,
Encoding contentEncoding)
{
return JsonNet(data, contentType, contentEncoding, JsonRequestBehavior.DenyGet);
} /// <summary>
/// 创建 <see cref="T:System.Web.Mvc.JsonNetResult"/> 对象,该对象使用指定 JSON 请求行为将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式。
/// </summary>
///
/// <returns>
/// 将指定对象序列化为 JSON 格式的结果对象。
/// </returns>
/// <param name="controller">控件器</param>
/// <param name="data">要序列化的 JavaScript 对象图。</param>
/// <param name="behavior">JSON 请求行为。</param>
public static JsonNetResult JsonNet(this Controller controller, object data, JsonRequestBehavior behavior)
{
return JsonNet(data, (string) null, (Encoding) null, behavior);
} /// <summary>
/// 创建 <see cref="T:System.Web.Mvc.JsonNetResult"/> 对象,该对象使用指定内容类型和 JSON 请求行为将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式。
/// </summary>
///
/// <returns>
/// 将指定对象序列化为 JSON 格式的结果对象。
/// </returns>
/// <param name="controller">控件器</param>
/// <param name="data">要序列化的 JavaScript 对象图。</param>
/// <param name="contentType">内容类型(MIME 类型)。</param>
/// <param name="behavior">JSON 请求行为</param>
public static JsonNetResult JsonNet(this Controller controller, object data, string contentType,
JsonRequestBehavior behavior)
{
return JsonNet(data, contentType, (Encoding) null, behavior);
} /// <summary>
/// 创建 <see cref="T:System.Web.Mvc.JsonNetResult"/> 对象,该对象使用内容类型、内容编码和 JSON 请求行为将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式。
/// </summary>
///
/// <returns>
/// 将指定对象序列化为 JSON 格式的结果对象。
/// </returns>
/// <param name="controller">控件器</param>
/// <param name="data">要序列化的 JavaScript 对象图。</param>
/// <param name="contentType">内容类型(MIME 类型)。</param>
/// <param name="contentEncoding">内容编码。</param><param name="behavior">JSON 请求行为</param>
public static JsonNetResult JsonNet(this Controller controller, object data, string contentType,
Encoding contentEncoding, JsonRequestBehavior behavior)
{
return JsonNet(data, contentType, contentEncoding, behavior);
} /// <summary>
/// 创建 <see cref="T:System.Web.Mvc.JsonNetResult"/> 对象,该对象使用内容类型、内容编码和 JSON 请求行为将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式。
/// </summary>
/// <param name="data">要序列化的 JavaScript 对象图。</param>
/// <param name="contentType">内容类型(MIME 类型)。</param>
/// <param name="contentEncoding">内容编码。</param>
/// <param name="behavior"></param>
/// <returns>JSON 请求行为</returns>
private static JsonNetResult JsonNet(object data, string contentType, Encoding contentEncoding,
JsonRequestBehavior behavior)
{
return new JsonNetResult()
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
} }
}

Controller扩展方法

写个JsonNetResult类,继承自JsonResult,重写ExecuteResult()方法,内部使用JsonNet来序列化。

 using System.Text;
using Newtonsoft.Json; namespace System.Web.Mvc
{
public class JsonNetResult : JsonResult
{
public Encoding ContentEncoding { get; set; }
public string ContentType { get; set; }
public object Data { get; set; } public JsonSerializerSettings SerializerSettings { get; set; }
public Formatting Formatting { get; set; } public JsonNetResult()
{
SerializerSettings = new JsonSerializerSettings();
} public override void ExecuteResult(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context"); HttpResponseBase response = context.HttpContext.Response; response.ContentType = !string.IsNullOrEmpty(ContentType)
? ContentType
: "application/json"; if (ContentEncoding != null)
response.ContentEncoding = ContentEncoding; if (Data != null)
{
var writer = new JsonTextWriter(response.Output) { Formatting = Formatting }; JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
serializer.Serialize(writer, Data); writer.Flush();
}
}
}
}

JsonNetResult

封装后的JsonNet序列化

 /// <summary>
/// 加载组件列表
/// </summary>
/// <param name="departmentId">作业部/厂</param>
/// <param name="unitId">组件Id</param>
/// <param name="tag">标签号</param>
/// <param name="pageIndex">当前页码</param>
/// <param name="pageSize">每页条数</param>
/// <returns>返回组件json数据</returns>
public JsonNetResult ListCom(long departmentId, IEnumberable<long> unitIds, string tag, int pageIndex, int pageSize)
{
var dataEntity = LdarService.ListCom(listUnitId, tag, pageIndex + , pageSize);
var dataModel = new Page<LdComModel> {Total = dataEntity.Total};
var data =
dataModel.DataList =
dataEntity.DataList.Select(model => Builder.Builder.Convert<LdComModel>(new object[] {model}));//Entity转ViewModel
dataModel.DataList = data;
return this.JsonNet(new
{
msg = CommonModelBuilder.BuildQuerySuccessMessage("组件信息维护", (int) dataModel.Total),
data = dataModel.DataList,
total = dataModel.Total
});
}

这样调用起来跟自带的Json(...)一样,非常方便。

由于时间关系,博客就先写到这里。不足及错误之处,敬请批评指正。

超高性能的json序列化之MVC中使用Json.Net的更多相关文章

  1. 使用Json.Net解决MVC中各种json操作

    最近收集了几篇文章,用于替换MVC中各种json操作,微软mvc当然用自家的序列化,速度慢不说,还容易出问题,自定义性也太差,比如得特意解决循环引用的问题,比如datetime的序列化格式,比如性能. ...

  2. MVC中处理Json和JS中处理Json对象

    MVC中处理Json和JS中处理Json对象 ASP.NET MVC 很好的封装了Json,本文介绍MVC中处理Json和JS中处理Json对象,并提供详细的示例代码供参考. MVC中已经很好的封装了 ...

  3. Json序列化与反序列化(对象与Json字符串的转换)--C#

    public class JsonHelper { #region Json序列化与反序列化 /// <summary> /// 将json转化为对象 /// (需要提前构造好结构一致的M ...

  4. 在MVC中使用Json.Net序列化和反序列化Json对象

    在.Net的MVC开发中,经常会使用到Json对象,于是,系统提供了JsonResult这个对象,其本质是调用.Net系统自带的Json序列化类JavaScriptSerializer对数据对象进行序 ...

  5. 解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题---Newtonsoft.Json

    1..Net开源Json序列化工具Newtonsoft.Json中提供了解决序列化的循环引用问题: 方式1:指定Json序列化配置为 ReferenceLoopHandling.Ignore 方式2: ...

  6. 【转】MVC中处理Json和JS中处理Json对象

    事实上,MVC中已经很好的封装了Json,让我们很方便的进行操作,而不像JS中那么复杂了. MVC中: public JsonResult Test() { JsonResult json = new ...

  7. ASP.NET MVC中的Json Binding和Validate

    引子:电子商务网站支付功能页面往往会有很多信息,对于这些信息的保存,往往是分步完成的,那么使用Ajax最合适不过了,比如其中的收货人信息模块.这些信息的新建和编辑保存都是用Ajax来完成的.那么有几种 ...

  8. IOC容器-Autofac在MVC中实现json方式注入使用

    在你阅读时,默认已经了解IOC和autofac的基本用法, 我在最近的我的博客项目中运用了IOC autofac 实现了依赖注入 由于我的项目时asp.net MVC所以我目前向大家展示MVC中如何使 ...

  9. Asp MVC 中处理JSON 日期类型

    注:时间有点忙,直接copy 过来的,要查看原址: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html I ...

随机推荐

  1. JMeter Http测试计划

    一.新建Http测试计划 二.添加线程组 设定5个线程,循环2次 三.添加Http请求 以百度为例: 四.添加监听:察看结果树 五.执行测试 5个用户,循环2次,共发了10个请求.

  2. 条款19:设计class犹如设计type

    1,新的type对象应该如何被创建和销毁? 这会影响class的构造函数ctor和析构函数dtor,以及内存分配函数和释放函数   //operator new //operator new[] // ...

  3. codeforces 83 D. Numbers

    题意: 给出l,r,k,(1 ≤ l ≤ r ≤ 2·109, 2 ≤ k ≤ 2·109) 求在区间[l,r]内有多少个数i满足 k | i,且[2,k-1]的所有数都不可以被i整除 首先,如果k不 ...

  4. mysql 笔记

    mysql配置主从复制的时候,不能将server-id设置成非数字,这样会导致mysqld启动失败. mysql重启的时候,自动会释放锁(这个锁应该是位于内存的) 执行sql脚本:source /ho ...

  5. 每天一个 Linux 命令(18):locate 命令

    locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了.在一般的 di ...

  6. POSTMAN发起请求收到乱码 http 406错误

    web前段异常: The resource identified by this request is only capable of generating responses with charac ...

  7. Python-Numpy函数-tile函数

    tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...

  8. Ibatis.net总是报:【ExecuteStoreCommand SqlParameterCollection 中已包含 SqlParameter】(转)

    今天很奇怪调用EF的ExecuteStoreCommand 出现了个这样的错误,怎么也调试不过,痛定思痛 原来 command被连着调用了而没有销毁掉   public static DataTabl ...

  9. canvas生成二维码,并下载保存为本地的图片

    function getTicket(id,salt){//qrcode生成canvas二维码 $(".zc-mask").show(); $(".edit-box&qu ...

  10. dsquery、netdom工具示例

    C:\>netdom query fsmo架构主机               DC1.lypower.com.cn域命名主机        DC1.lypower.com.cnPDC      ...