大佬教程收集整理的这篇文章主要介绍了在webmethod中使用json.net序列化程序,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个webmethod,我通过AJAX / JSON调用.
我们称之为“GlobalMethod”,它用于管理“容器”对象,该对象具有从相同“基类”派生的项列表.
这是我的情况的代码示例:
[Webservice(Namespace = "http://tempuri.org/")] [WebserviceBinding(ConformsTo = WsiProfiles.basicProfile1_1)] [System.ComponentModel.ToolBoxItem(false)] [System.Web.Script.services.Scriptservice] public class Myservice : System.Web.services.Webservice { [WebMethod] public String GlobalMethod(Container data) { String result = ""; foreach (var item in data.Items) { result += item.baseProperty; if (item is FirstDerivedClass) result += ((FirstDerivedClass)item).FirstDerivedProperty; else if (item is SecondDerivedClass) result += ((SecondDerivedClass)item).SecondDerivedProperty; } return result; } } public class Container { public List<BaseClass> Items; } public abstract class BaseClass { public String BaseProperty; } public class FirstDerivedClass : BaseClass { public String FirstDerivedProperty; } public class SecondDerivedClass : BaseClass { public String SecondDerivedProperty; }
这种方法根本无法解决.我将无法使用默认的Javascriptserializer调用此方法,因为序列化程序无法解析容器将具有的对象类型:它们可以是FirstDerivedClass或SecondDerivedClass类型.
所以,浏览网页寻找我的问题的解决方案,我遇到了@L_801_16@,其方法JsonConvert.DeserializeObject能够检索使用JsonConvert.serializeObject序列化的原始对象类型,因为它添加了一个名为“$type”的属性”.
我现在的问题是:如何使用此序列化程序而不是ASMX使用的默认方法制作web方法?
如果方法签名仍然存在
[WebMethod] public String GlobalMethod(Container data)
然后我将获得一个完全空的Container对象,因为框架正在进行反序列化工作,并且不知道要实例化哪些项目,并且我无法告诉框架它应该使用Json.NET来完成工作,能够完全反序列化数据.
[WebMethod] public String GlobalMethod(String data) { String result = ""; Container container = JsonConvert.DeserializeObject<Container>(data,new JsonserializerSetTings { TypenameHandling = TypenameHandling.objects }); foreach (var item in container.Items) { ...
然后我会得到另一个服务器错误500,因为“没有为u0027system.String u0027的类型定义无参数构造函数”
好吧,希望我的问题很清楚……我一整天都花在它上面,我似乎找不到解决方案.重新审视我的方法的体系结构,以避免使用派生类是不是一个选项(要注意实际的代码要复杂得多,我只是简化它以达到目的!).
顺便说一句,我将添加调用webmethod的ajax方法以这种方式完成:
$.ajax({ type: "POST",url: wsUrl + method,data: JSON.Stringify(data),contentType: "application/json; charset=utf-8",dataType: "json",processData: false,success: function(msg) { try{ success(JSON.parse(msg.d)); } finally { } },error: error });
感谢任何与我分享知识的人!
我想分享一下我是如何解决我的问题的.正如我已经说过的,我用这种方式修改了我的方法:
[WebMethod] public String GlobalMethod(String data) { String result = ""; Container container = JsonConvert.DeserializeObject<Container>(data,new JsonserializerSetTings { TypenameHandling = TypenameHandling.objects }); foreach (var item in container.Items) {
最初,我开始收到错误500“没有为u0027system.String u0027类型定义的无参数构造函数”
但最终我发现了原因:从客户端到服务器的json字符串被.NET框架反序列化为包含的对象,该对象不是字符串,而是实际的JSON对象!
所以诀窍是以下,在我的ajax方法中:
$.ajax({ type: "POST",**data: JSON.Stringify(JSON.Stringify(data)),** contentType: "application/json; charset=utf-8",error: error });
这意味着json对象被封装在另一个字符串中,该字符串将由我的服务器端GlobalMethod(字符串)通过Json.NET手动反序列化.
显然我不会在ajax例程中包含这个双“Stringify”,但我会注意将输入中的JSON.Stringified数据传递给ajax例程本身!
以这种方式更改容器:
public class Container { public List<MyUnionBaseClass> Items; }
和定义(伪代码):
public class MyUnionBaseClass{ public void MyUnionBaseClass(BaseClass b){ this.SETVALue(b); }; final public BaseClass getValue(){ if(first!=null) return (BaseClass) first; if(second!=null)return (BaseClass) second; return null; } final public SETVALue(BaseClass b){ if(b instanceOf firstClass){ first = (FirstClass) b; } if(b instanceOf secondClass){ second = (SecondClass) b; } } private FirstDerivedClass first=null; private SecondDerivedClass second=null; }
P.s:这是非常好的,应该加以改进.这有意义吗?
以上是大佬教程为你收集整理的在webmethod中使用json.net序列化程序全部内容,希望文章能够帮你解决在webmethod中使用json.net序列化程序所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。