2012-05-14 99 views
0

我有一個必須返回JSON的wcf服務。我的代碼如下所示:WCF迴歸糟糕JSON

{ 「areaGetStreetTypesResult」:

public String areaGetStreetTypes(int city_id, int language_id) 
     { 
      string json = ""; 
      string responseList = "{\"triname\":\"IMP\",\"name\":\"IMPASSE\"}"; 
      if (responseList.Length != 0){ 
       string responseStatusJSON = "{\"status\":0, \"message\":\"Success !!!\"}"; 
       json += "{\"responseList\":[" + responseList + "],"; 
       json += "\"responseStatus\":" + responseStatusJSON + "}"; 
      } 
      else{ 
       string responseStatusJSON = "{\"status\":1, \"message\":\"Error !!!\"}"; 
       json += responseStatusJSON; 
      } 
      return json; 
     } 



//my interface looks like 
[OperationContract] 
     [WebInvoke(Method = "POST", UriTemplate = "areaGetStreetTypes", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]   
     String areaGetStreetTypes(int city_id, int language_id); 

原始格式的響應 「{\」 responseList \ 「:[{\」 triname \ 「:\」 IMP \」, \「name \」:\「IMPASSE \」}],\「responseStatus \」:{\「status \」:0,\「message \」:\「Success !!! \」}}「}

我使用php腳本進行測試。第一解碼後:

stdClass的對象(

[areaGetStreetTypesResult] => {"responseList":[{"triname":"IMP","name":"IMPASSE"}],"responseStatus":{"status":0, "message":"Success !!!"}} 

只有在我的第二個json_decode我得到我想要的東西:GOOD JSON Response

我可以在我的服務改變什麼第一次獲得好的JSON?我只想解碼一次。

回答

2

您JSON'ing兩次 - 一次在您的方法中,第二次當您告訴WCF在WebInvoke屬性中使用JSON序列化時。

爲什麼不讓更多的契約和返回它們,而不是手動構造結果字符串?

+0

這只是一個測試。我不能實現一個固定類型,因爲我從數據庫動態獲取數據。我不知道返回的列號或列的名稱。 –

1

您可以創建如下圖所示,可以返回一個類的對象:

namespace Rest 
{ 
    public class JsonRes 
    { 
     public ResponseList ResponseList { get; set; } 
     public ResStatus ResponseStatus { get; set; } 

    } 
    public class ResponseList 
    { 
     public string triName { get; set; } 
     public string name { get; set; } 
    } 
    public class ResStatus 
    { 
     public string status { get; set; } 
     public string message { get; set; } 
    } 

} 

WCF框架做的序列化JSON。

如果你有從數據庫動態構建json字符串,然後嘗試找到是否可以得到一個通用的對象,在所有情況下都是足夠的。就像有一個List對象具有列名和它的值,然後將完整列表傳回給客戶端。

+0

我已經有兩個班。我有Response(responseList,resposeMessage:ResponseStatus)和ResponseStatus(狀態,消息)。我會嘗試你的方法,但我使用字典和JSON返回類似的東西:「key」:「keyName」,「value」:「valueName」,我想要「keyName」:「valueName」。 –

+0

嘗試使用列表(使它成爲一個類型化對象),並且會給你類似key的值:value – Rajesh

+0

另一種方法是根據從數據庫中得到的結果集動態創建類,然後使用此類由框架返回。儘管這將是一個乏味的過程。請參閱動態創建類的鏈接(http://social.msdn.microsoft.com/Forums/eu/csharpgeneral/thread/abff98e3-93fe-44fa-bfd4-fcfe297dbc43) – Rajesh