【问题标题】:WCF service returning object in Json formatWCF 服务以 Json 格式返回对象
【发布时间】:2012-09-20 11:52:35
【问题描述】:

我有一个 WCF 服务,我正在构建一个名为 FinalList 的对象,其中包含一个名为 Chart 的对象和一个 List<Data>。 我想以以下格式返回我的ajax函数json数据:

{"d":{"chart":{"caption":"Year","exportatclient":"1","exportenabled":"1","exporthandler":"chartExporter","labelDisplay": "wrap","numberprefix":"","showborder":"1","slantLabels":"1","useroundedges":null,"yaxisname":"数字 的 hits"},"data":[{"label":"1960s","link":null,"tooltext":null,"value":3},{"label":"1970s","link": null,"tooltext":null,"value":56},{"label":"1980s","link":null,"tooltext":null,"value":98}]}}

但是我的服务是这样返回的:

{"d":{"__type":"FinalList:#MyNamespace.FusionChartsFields","chart":{"__type":"Chart:#MyNamespace.FusionChartsFields","caption":"Year","exportatclient ":"1","exportenabled":"1","exporthandler":"chartExporter","labelDisplay":"wrap","numberprefix":"","showborder":"1","slantLabels":" 1","useroundedges":null,"yaxisname":"数字 的 hits"},"data":[{"__type":"Data:#MyNamespace.FusionChartsFields","label":"1960s","link":null,"tooltext":null,"value":3}, {"__type":"Data:#MyNamespace.FusionChartsFields","label":"1970s","link":null,"tooltext":null,"value":56},{"__type":"Data:# MyNamespace.FusionChartsFields","label":"1980s","link":null,"tooltext":null,"value":98}]}}

当我使用 WebServices (asmx) 时,我只需要将我的类声明为“对象”而不是 FinalList,那么结果就是我需要的正确 json 格式。

我尝试将它转换为字符串,它给我带来了正确的东西,但包括 '\'(例如 {"d":{\"chart\":{\"caption\":\"Year\")和这不是我想要的。

有人知道如何删除这些“__type”和类名吗?

我正在使用 .Net 4

我的 FinalList 类如下:

public class FinalList
    {
        private Chart _chart;
        private List<Data> _data = new List<Data>();

        public Chart chart
        {
            get { return _chart; }
            set { _chart = value; }
        }

        public List<Data> data
        {
            get { return _data; }
            set { _data = value; }
        }
    }

我的服务合同包含

[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]

在其声明之上。

【问题讨论】:

  • 你的模型类定义是什么样的? (__type 通常是对 DataContractSerializer 关于如何转换接口或抽象基类的提示。)
  • 我的 svc.cs 中的类在其声明上方有“[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]”。

标签: c# asp.net json wcf


【解决方案1】:

基本上,结果被包装在一个附加类型中(大概是为了允许多个结果?)并且每个返回的对象都有一个 __type 属性。即使是简单的结果值也至少包含包装类型,所以即使说字符串结果也包含 d: 类型。

如果您在客户端上使用 MS AJAX,则没有问题 - 客户端知道如何将此 JSON 解析为干净的对象。但是,如果您使用其他机制 - 例如 jQuery 或 Prototype 来检索结果集,您将返回一个时髦的对象,例如您必须使用 result.d.LastName,这很丑。

试试这个,

[OperationContract]
[WebInvoke(BodyStyle=WebMessageBodyStyle.WrappedRequest,RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]

【讨论】:

  • 也许你写了“有谁知道我如何删除这些“__type”和类名?”
  • 所以你是说我只能在我改变我的 ajax 调用时才能改变这个?我无法通过 WCF 服务执行任何操作?
  • 更改服务中的属性!不是 jour js。使用 WebGet 在浏览器中进行测试也可以更简单。
  • 对不起,我已经按照您的示例进行了更改,但没有任何更改。但我仍在使用 jQuery 进行 ajax 调用。
  • 你在使用什么行为? ?
【解决方案2】:

您对 WCF 服务使用什么行为?如果您使用的是&lt;enableWebScript /&gt;,那么在服务行为配置中切换到&lt;webHttp/&gt; 将解决您的问题。

正如 Cyber​​maxs 所说,如果您使用的是 ASP.NET Ajax 客户端,那么这不是问题,您可以继续使用&lt;enableWebScript /&gt;

【讨论】:

    【解决方案3】:

    尝试添加如下构造函数:

    public class FinalList
    {
        private Chart _chart;
        private List<Data> _data = new List<Data>();
    
        public Chart chart
        {
            get { return _chart; }
            set { _chart = value; }
        }
    
        public List<Data> data
        {
            get { return _data; }
            set { _data = value; }
        }
    
        protected internal FinalList() { }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 2013-10-23
      • 2012-09-19
      • 2021-09-08
      • 1970-01-01
      相关资源
      最近更新 更多