amh*_*hed 2 asp.net-mvc serialization json
这是设置:
我有一些 MVC 控制器,旨在由 jQuery ajax 请求使用。一个正常的请求看起来有点像这样:
$.ajax("/Solicitor/AddSolicitorToApplication", {
data: putData,
type: "POST", contentType: "application/json",
success: function (result) {
//My success callback
}
}
});
Run Code Online (Sandbox Code Playgroud)
我的控制器看起来像这样:
[HttpPost]
public ActionResult InsertLoanApplication(MortgageLoanApplicationViewModel vm)
{
var mortgageLoanDTO = vm.MapToDTO();
return Json(_mortgageLoanService.UpdateMortgageLoanApplication(mortgageLoanDTO), JsonRequestBehavior.DenyGet);
}
Run Code Online (Sandbox Code Playgroud)
对于传递到控制器的大多数对象来说,这完全可以正常工作,但在这种特定情况下,传递的对象的属性之一需要以特定方式反序列化。
我添加了一个之前与 MVC4 Web API 一起使用的 JsonConverter,但在本例中我需要将其应用到常规 mvc 控制器。
我尝试在我的 global.asax 中注册 JsonConverter,如下所示:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new GrizlyStringConverter());
Run Code Online (Sandbox Code Playgroud)
但到目前为止还无法反序列化该对象。
JsonValueProviderFactory
如果您想在Json.NET
将 JSON 请求绑定到视图模型时使用,您应该将内置类替换为自定义类。
您可以编写一个,如下要点所示:
public sealed class JsonDotNetValueProviderFactory : ValueProviderFactory
{
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
{
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
}
if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
{
return null;
}
using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream))
{
var bodyText = reader.ReadToEnd();
return String.IsNullOrEmpty(bodyText)
? null :
new DictionaryValueProvider<object>(
JsonConvert.DeserializeObject<ExpandoObject>(
bodyText,
new ExpandoObjectConverter()
),
CultureInfo.CurrentCulture
);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后将内置的替换为您的自定义的Application_Start
:
ValueProviderFactories.Factories.Remove(
ValueProviderFactories
.Factories
.OfType<JsonValueProviderFactory>()
.FirstOrDefault()
);
ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory());
Run Code Online (Sandbox Code Playgroud)
就是这样。现在,您使用 Json.Net 而不是 JavaScriptSerializer 来处理传入的 JSON 请求。