2012-09-20 46 views
1

我有一個WCF服務,我正在構建一個名爲FinalList的對象,其中包含一個名爲Chart的對象和一個List<Data>。 我想回到我的AJAX功能JSON數據如下格式:WCF服務以Json格式返回對象

{ 「d」:{ 「圖表」:{ 「標題」: 「年」, 「exportatclient」: 「1」,」 exportenabled 「:」 1" , 「exporthandler」: 「chartExporter」, 「labelDisplay的」: 「包裹」, 「numberprefix」: 「」, 「showborder」: 「1」, 「slantLabels」: 「1」, 「useroundedges」: null,「yaxisname」:「數字 , 命中」},「data」:[{「label」:「1960s」,「link」:null,「tooltext」:null,「value」:3},{標籤 「:」 1970」, 「鏈接」:空, 「tooltext」:空, 「值」:56},{ 「標籤」: 「1980」, 「鏈接」:空, 「tooltext」:空, 「值」 :98}]}}

但是我的服務是這樣返回的:

{ 「d」:{ 「__類型」: 「FinalList:#MyNamespace.FusionChartsFields」, 「圖」:{ 「__類型」: 「圖表:#MyNamespace.FusionChartsFields」, 「標題」: 「年」 「exportatclient」: 「1」, 「exportenabled」: 「1」, 「exporthandler」: 「chartExporter」, 「labelDisplay的」: 「包裹」, 「numberprefix」: 「」, 「showborder」: 「1」,「slantLabels 「:」1「,」useroundedges「:null,」yaxisname「:」Number of hits「},」data「:[{」__ type「:」Data:#MyNamespace.FusionChartsFields「,」label「:」1960s 「 」鏈接「:NULL, 」tooltext「:NULL, 」值「:3},{ 」__類型「: 」數據:#MyNamespace.FusionChartsFields「, 」標籤「: 」20世紀70年代「, 」鏈接「:NULL,」 tooltext 「:空,」 值 「:56},{」 __類型 「:」 數據:#MyNamespace.FusionChartsFields」, 「標籤」: 「1980」, 「鏈接」:空, 「tooltext」:空, 「值」: 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)] 

其聲明之上。

+0

什麼是你的模型類的定義是什麼樣子? ('__type'通常是DataContractSerializer關於如何翻譯接口或抽象基類的提示。) – faester

+0

我的svc.cs中的類在它的聲明上面有「[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]]」。 – Jenninha

回答

1

基本上結果被包裹在一個額外的類型(大概是爲了允許多個結果?),並且每個返回的對象都有一個__type屬性。即使簡單的結果值至少包括包裝類型,所以即使說一個字符串結果包含d:type。

如果您在客戶端上使用MS AJAX,這沒有任何問題 - 客戶端知道如何將此JSON解析爲乾淨的對象。但是,如果您使用其他一些機制(例如jQuery或Prototype來檢索結果集),則會返回一個時髦的對象,例如,您必須去result.d.LastName,這很醜陋。

試試這個,

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

我只使用$ .ajax – Jenninha

+0

也許,但你寫了「有誰知道我可以如何刪除這些」__type「和類名?」 – Cybermaxs

+0

那麼你是說我只能改變這個,如果我改變我的ajax調用?我無法從我的WCF服務中做任何事情? – Jenninha

0

您使用的WCF服務是什麼行爲?如果您使用<enableWebScript />,則在服務行爲配置中切換到<webHttp/>將解決您的問題。

正如Cyber​​maxs所說,如果您使用的是ASP.NET Ajax客戶端,那麼這不會成爲問題,您可能會繼續使用<enableWebScript />

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

}