2012-05-14 62 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