前面有写使用自己的mvc 序列化工具即jsonNetResult。我这里结合之前写的jsonNetResult来做一个Json序列化工具,而且序列化ObjectId成一个字符串。详细代码例如以下

using System;
using System.IO;
using System.Text;
using System.Web.Mvc;
using Aft.Build.Common;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization; namespace Aft.Build.MvcWeb.Common
{
public class JsonNetResult : JsonResult
{
public JsonNetResult()
{
Settings = new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Error
};
}
public JsonNetResult(object data, JsonRequestBehavior behavior = JsonRequestBehavior.AllowGet, string contentType = null, Encoding contentEncoding = null)
{
Data = data;
JsonRequestBehavior = behavior;
ContentEncoding = contentEncoding;
ContentType = contentType;
} private JsonSerializerSettings _settings;
public JsonSerializerSettings Settings
{
get
{
_settings = _settings ?? new JsonSerializerSettings();
_settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
_settings.Converters.Add(new ObjectIdConverter());
return _settings;
}
private set { _settings = value; }
} public override void ExecuteResult(ControllerContext context)
{ if (context == null)
throw new ArgumentNullException("context");
if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
throw new InvalidOperationException("JSON GET is not allowed");
var response = context.HttpContext.Response;
response.ContentType = string.IsNullOrEmpty(ContentType) ? "application/json" : ContentType; if (ContentEncoding != null)
response.ContentEncoding = ContentEncoding;
if (Data == null)
return;
var scriptSerializer = JsonSerializer.Create(Settings);
using (var sw = new StringWriter())
{
scriptSerializer.Serialize(sw, Data);
response.Write(sw.ToString());
}
}
}
}

在jsonnetresult加入一行如图所看到的代码:

_settings.Converters.Add(new ObjectIdConverter());

我们的ObjectIdConverter详细实现例如以下:

using System;
using MongoDB.Bson;
using Newtonsoft.Json; namespace Aft.Build.Common
{
public class ObjectIdConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value.ToString());
} public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
ObjectId result;
ObjectId.TryParse(reader.Value as string, out result);
return result;
} public override bool CanConvert(Type objectType)
{
return typeof(ObjectId).IsAssignableFrom(objectType);
}
}
}

这样JsonNetResult就具备能够序列化ObjectId类型的数据了。

当然其它有特殊须要序列的话的东西实现方式类同。

序列化完毕了。接下来是反序列化。假设不经处理Objectid字符串是没有办法反序列ObjectId对象的会变成Objectid.empt(即全是零0),或者是使用字符串来接收,可是这不是我们希望看到的。

我们使用mvc ModelBinder 来实现ObjectId对象的反序列化

详细代码例如以下:

加入引用

using System;
using System.Web.Mvc;
using MongoDB.Bson;

代码实现:

public class ObjectIdModelBinder : IModelBinder
{ public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType != typeof(ObjectId))
{
return ObjectId.Empty;
}
var val = bindingContext.ValueProvider.GetValue(
bindingContext.ModelName);
if (val == null)
{
return ObjectId.Empty;
} var value = val.AttemptedValue;
if (value == null)
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Wrong value type");
return ObjectId.Empty;
}
ObjectId result;
if (ObjectId.TryParse(value, out result))
{
return result;
}
return ObjectId.Empty;
}
}
public class ObjectIdProvider : IModelBinderProvider
{
public IModelBinder GetBinder(Type modelType)
{
if (modelType == typeof(ObjectId) || modelType == typeof(ObjectId?))
{
return new ObjectIdModelBinder();
}
return null;
}
}

全局注冊,在Global.asax文件Application_Start方法中加入例如以下代码:

ModelBinderProviders.BinderProviders.Add(new ObjectIdProvider());

这样ObjectId反序列化就做好了,是不是非常easy,呵呵。

mvc使用mongodb时objectId序列化与反序列化的更多相关文章

  1. .net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值

    在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, ...

  2. c# Json 自定义类作为字典键时,序列化和反序列化的处理方法

    一般情况下,Newtonsoft.Json.dll 对 Dictionary<int,object>.Dictionary<string,object>等序列化与反序列化都是成 ...

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

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

  4. 【Java IO流】对象的序列化和反序列化

    对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...

  5. MVC JSON JavaScriptSerializer 进行序列化或反序列化时出错

    MVC control中返回json格式数据一般都是如下格式 [HttpPost] public ActionResult CaseAudit(string name) { var data =&qu ...

  6. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  7. JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值

    在.net mvc的controller中,方法返回JsonResult,一般我们这么写:   [HttpPost]   public JsonResult QueryFeature(string u ...

  8. ASP.NET MVC 网站开发总结(六)——简谈Json的序列化与反序列化

    首先,先简单的谈一下什么是序列化与反序列化,序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通 ...

  9. 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性

    "/"应用程序中的服务器错误.使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. ...

随机推荐

  1. 携程transform放大效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. UIPageViewController 翻页、新手引导--UIScrollView:pagingEnabled

    UIPageViewController 翻页.新手引导--UIScrollView:pagingEnabled

  3. Flask框架 之request对象

    一.request对象属性 属性 说明 类型 data 记录请求的数据,并转换为字符串 * form 记录请求中的表单数据 MultiDict args 记录请求中的查询参数 MultiDict co ...

  4. 413 Request Entity Too Large报错处理

    修改nginx配置   这是最简单的一个做法,着报错原因是nginx不允许上传配置过大的文件,那么件把nginx的上传大小配置调高就好.    1.打开nginx主配置文件nginx.conf,一般在 ...

  5. nginx报错:Permission denied

    vi /etc/selinux/config #SELINUX=enforcing #注释掉 #SELINUXTYPE=targeted #注释掉 SELINUX=disabled #增加 :wq! ...

  6. CAD得到范围内实体(网页版)

    主要用到函数说明: IMxDrawSelectionSet::Select 构造选择集.详细说明如下: 参数 说明 [in] MCAD_McSelect Mode 构造选择集方式 [in] VARIA ...

  7. 08Microsoft SQL Server 数据查询

    Microsoft SQL Server 数据查询 单表查询所有列 --查询所有行所有列 select all * from table; --查询不重复行的所有列 select distinct * ...

  8. 利用freemarker+SAX解析xml的方式对excel文件字段校验

    利用freemarker对参数进行校验这篇文章主要用到的技术点: 自定义注解的使用反射机制SAX解析xmlFreemarker的运用我们在工作中经常需要上传excel文件,然后在对文件中的字段进行校验 ...

  9. [luogu3067 USACO12OPEN] 平衡的奶牛群

    传送门 Solution 折半搜索模板题 考虑枚举每个点在左集合和右集合或者不在集合中,然后排序合并即可 Code //By Menteur_Hxy #include <cmath> #i ...

  10. ubuntu 14.04 挂载window共享目录

    (1) 先在ubuntu系统里,新建一个目录用于挂载,目录假设为 /mnt/win: sudo mkdir /mnt/win (2)在windows系统,共享出一个文件夹,共享名称假设为www sud ...