1

我有一个 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":"点击数"},"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":"点击数"},"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)]

在其声明之上。

4

3 回答 3

1

您对 WCF 服务使用什么行为?如果您正在使用,<enableWebScript />那么切换到<webHttp/>服务行为配置将解决您的问题。

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

于 2012-09-20T12:25:45.553 回答
1

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

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

尝试这个,

[OperationContract]
[WebInvoke(BodyStyle=WebMessageBodyStyle.WrappedRequest,RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
于 2012-09-20T12:20:39.540 回答
0

尝试添加如下构造函数:

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() { }

}
于 2015-01-26T15:16:54.127 回答