当前位置: 首页 > 编程语言 > C#

如何在MVC5项目中使用Json.NET进行JSON模型绑定?分享

时间:2023-04-11 01:32:12 C#

MVC5项目中如何使用Json.NET进行JSON模型绑定?我一直在网上寻找答案或示例,但一直找不到。当模型绑定到JSON.NET库时,我只想更改用于反序列化JSON的默认JSON序列化程序。我找到了这个SOpost,但到目前为止无法让它工作,我什至看不到System.Net.Http.Formatters命名空间,也看不到GlobalConfiguration。我错过了什么?更新我有一个ASP.NETMVC项目,它基本上是一个MVC3项目。目前我的目标是.NET4.5并使用ASP.NETMVC5和关联的NuGet包。我没有看到System.Web.Http程序集,也没有看到任何类似的名称空间。在这种情况下,我想注入JSON.NET作为JSON类型请求的默认模型绑定器。我终于找到了答案。基本上我不需要MediaTypeFormatter的东西,它不是为在MVC环境中使用而设计的,它在ASP.NETWebAPI中,这就是为什么我看不到那些引用和命名空间(顺便说一句,它们包含在Microsoft.AspNet中.WeApiNuGet包)。解决方案是使用自定义值提供程序工厂。这是所需的代码。publicclassJsonNetValueProviderFactory:ValueProviderFactory{publicoverrideIValueProviderGetValueProvider(ControllerContextcontrollerContext){//首先确保我们有一个有效的上下文if(controllerContext==null)thrownewArgumentNullException("controllerContext");//现在确保我们正在处理一个json请求//获取通用流阅读器(获取http流的阅读器)varstreamReader=newStreamReader(controllerContext.HttpContext.Request.InputStream);//将流阅读器转换为JSON文本阅读器varJSONReader=newJsonTextReader(streamReader);//告诉JSON读取if(!JSONReader.Read())returnnull;//创建一个新的Json序列化器varJSONSerializer=newJsonSerializer();//将动态对象转换器添加到我们的序列化器JSONSerializer.Converters.Add(newExpandoObjectConvert呃());//使用JSON.NET将对象反序列化为动态(expando)对象ObjectJSONObject;//如果我们以“[”开头,将其视为数组if(JSONReader.TokenType==JsonToken.StartArray)JSONObject=JSONSerializer.Deserialize>(JSONReader);否则JSONObject=JSONSerializer.Deserialize(JSONReader);//创建一个后备存储来保存这个反序列化的所有属性varbackingStore=newDictionary(StringComparer.OrdinalIgnoreCase);//将所有属性添加到此后备存储AddToBackingStore(backingStore,String.Empty,JSONObject);//返回字典值提供程序中的对象,以便MVC理解它returnnewDictionaryValueProvider(backingStore,CultureInfo.CurrentCulture);}privatestaticvoidAddToBackingStore(DictionarybackingStore,stringprefix,objectvalue){vard=valueasIDictionary;if(d!=null){foreach(varentryind){AddToBackingStore(backingStore,MakePropertyKey(prefix,entry.Key),entry.Value);}返回;}varl=值作为IList;if(l!=null){for(vari=0;i您可以在Application_Start方法中使用它://删除默认实现ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType().FirstOrDefault());//添加我们的自定义ValueProviderFactories.Factories.Add(newJsonNetValueProviderFactory());这是一篇为我指明正确方向的帖子,这篇文章也给了价值提供者和模型组合器一个很好的解释我也遇到了这个问题。我正在发布JSON到一个动作,但我的JsonProperty名称被忽略了。所以,我的模型属性总是空的。publicclassMyModel{[JsonProperty(PropertyName="prop1")]publicintProperty1{get;放;}[JsonProperty(PropertyName="prop2")]publicintProperty2{get;放;}[JsonProperty(PropertyName="prop3")]publicintProperty3{get;放;}publicintFoo{得到;放;我使用这个自定义jquery函数发布到操作:/json;charset=utf-8'};if(data!==undefined)o.data=JSON.stringify(data);if(dataType!==undefined)o.dataType=dataType;返回$.ajax(o);};}(jQuery));我称之为:data={prop1:1,prop2:2,prop3:3,foo:3,};$.postJSON('/Controller/MyAction',data,'json').success(function(response){...对我返回的JSON做任何事情});不幸的是,只有foo被绑定(很奇怪,因为它不一样,但我猜默认的模型绑定器是不区分大小写的)Dejan的模型活页夹的通用版本,它对我来说非常有用。它可能会使用一些虚拟检查(比如确保请求实际上是application/json),但它现在正在做这个技巧。内部类JsonNetModelBinder:IModelBinder{publicobjectBindModel(ControllerContextcontrollerContext,ModelBindingContextbindingContext){controllerContext.HttpContext.Request.InputStream.Position=0;varstream=controllerContext.RequestContext.HttpContext.Request.InputStream;varreadStream=newStreamReader(stream,Encoding.UTF8);varjson=readStream.ReadToEnd();返回JsonConvert.DeserializeObject(json,bindingContext.ModelType);当我想在特定操作上使用它时,我只是告诉它我想使用我的自定义Json.Net模型联编程序:[HttpPost]publicJsonNetResultMyAction([ModelBinder(typeof(JsonNetModelBinder))]MyModelmodel){...}现在我的[JsonProperty(PropertyName="")]属性不再在MyModel中被忽略,一切都已正确绑定!在我的例子中,我不得不反序列化包括接口和动态加载类型等的复杂对象。因此提供自定义值提供程序不起作用,因为MVC仍然必须尝试弄清楚如何实例化接口然后失败。由于我的对象被正确注释为使用Json.NET,我采取了不同的方法:我已经实现了自定义模型绑定器并使用Json.NET显式反序列化请求文字数据,如下所示:internalclassCustomModelBinder:IModelBinder{publicobjectBindModel(ControllerContextcontrollerContext,ModelBindingContextbindingContext){//使用Json.NET反序列化传入的PositioncontrollerContext.HttpContext.Request.InputStream.Position=0;//请参阅:http://stackoverflow。com/a/3468653/331281Streamstream=controllerContext.RequestContext.HttpContext.Request.InputStream;varreadStream=newStreamReader(stream,Encoding.UTF8);字符串json=readStream.ReadToEnd();返回JsonConvert.Deserialize.Object(j..);自定义模型绑定程序在Global.asax.cs中注册:以上是C#学习教程:如何在MVC5项目中使用Json.NET进行JSON模型绑定?如果分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注—ModelBinders.Binders.Add(typeof(MyClass),newCustomModelBinder();本文采集自互联网,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载,请注明出处: