none
有关WCF序列化对象到JSON格式之 __type问题 RRS feed

  • 问题

  • 刚从j2ee转入到.net中,现在做的应用基本上都是基于WCF的,在应用ajax调用wcf是有一些不很完美的事情,就是每次wcf返回的json对象中总是多了个 __type ...这样一个东西,(如下图:)

     

    代码实现如下:

     

     [DataContract(Namespace = "org.aco.datacontract")]
      public class M
     {  
      [DataMember]
      public int Id{get;set;}
      [DataMember]
      public string Code { get; set; }
      [DataMember]
      public DateTime JoinIn { get; set; }  
      [DataMember]
      public bool isSystem { get; set; }
     }
    

     

    [DataContract]若指定,则使用指定的命名空间,不指定命名空间的,WCF会自动加上你的M类所在(.cs文件中)的命名空间

    我们现在系统中的WCF需要承载在不同的宿主上(含有IIS , Windows Serivce ,和独立的.exe),所以返回均为对象或者List<T>,在WCF中不做其它的如拼接字符,转换数据格式等处理,后查阅msdn,其中在独立序列化页面上就有这部分的解释,它说是为的反序列化的需要,再后又查codeproject资料,其说之所以出现命名空间和类型,是因为MS的Asp.net中的ajax部分要用到它,主要是为了Asp.net的ajax反序列化.总是没有办法去掉这个__type ...么

    后来看到Cheeso 给了一个回答,他的意思是说如果你要用WCF自已内部默认的序列化,返回的JSON中都不可能去掉这个__type...的,你只能自己在返回的JSON中处理那些多余的字符串了,(详见:http://stackoverflow.com/questions/5646419/how-to-serialize-class-type-but-not-the-namespace-to-a-json-string-using-datacont)其实我只想让传输的数据少一些,尽量不生成是最好的了

    他也给出了一个折中的办法,将数据协定类不写在任何的命名空间内,JSON中的命名空间就为#,这个我没有做测试,在跟贴中有人提出来使用 [DataContract(Namespace = "")]我试了下,没有命名空间了,如下图:


    如何可去掉这个__type: "M" 呢

     





    • 已编辑 unidoz 2011年8月31日 7:14
    2011年8月27日 1:47

全部回复

  • 你可以创建Rest风格的wcf服务,通过 WebInvoke或WebGet 的 ResponseFormat 属性来设置json.
    2011年8月27日 2:02
  • 这个,我还没研究过。你看看能否Override JSON序列化器的Serlize()方法,来控制。

    或者只有返回其它格式自己解析了


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年8月29日 8:48
    版主
  • 我现在用的就是你所说的,所有的客户端调用都要是用jquery的ajax来完成的.以下为我定义的图:

     

     [ServiceContract]
     public interface IPlatformService : IService
     {
      [OperationContract] 
      [WebInvoke(Method="POST",BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]
      List<aco.sysMgr.domain.Module> GetModuleList(string id);
      
      [OperationContract]
      [WebInvoke(Method="POST",BodyStyle=WebMessageBodyStyle.WrappedRequest,ResponseFormat=WebMessageFormat.Json)]
      List<M> GetMList(string id);
     }
    
    


     

    是没有什么问题的,Cheeso 给我答复说只要(数据契约)类有继承关系就一定不可能去掉__type了,您有没有写好的例程给看看



    2011年8月31日 10:06