2014-01-07 65 views
0

我想反序列化从WCF服务的JSON字符串到显示空输出的C#列表。JSON字符串反序列化到C#列表

WCF服务

[OperationContract] 
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, 
RequestFormat = WebMessageFormat.Json, 
ResponseFormat = WebMessageFormat.Json 
)] 
public String getuserSite(String UserCode) 
{ 
    string s = ""; 
    { 
     _ds = new DataSet(); 
     try 
     { 
      _dbObj = new Database(); 
      if (ConfigurationManager.AppSettings["DB"].ToString() == "S") 
      { 
       string[] _paramNames = { "@UserCode" }; 
       object[] _paramvalue = { UserCode }; 
       _ds = _dbObj.GetDatasetProc("getuserSite", _paramNames, _paramvalue); 
      } 
      else 
      { 
       string[] _paramNames = { "UserCode" }; 
       object[] _paramvalue = { UserCode }; 
       _ds = _dbObj.GetDatasetProc("getuserSite", _paramNames, _paramvalue); 
      } 
      return **GetJSONString**(_ds, "Sites"); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      _dbObj.Close(); 
     }  
} 

GetJSONString方法返回JSON字符串

[OperationContract] 
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json 
    )] 
    public static string GetJSONString(DataSet Ds, String Name) 
    { 
     DataTable Dt = Ds.Tables[0]; 
     if (Name != "") 
     { 
      Dt.TableName = Name; 
     } 
     string[] StrDc = new string[Dt.Columns.Count]; 
     string HeadStr = string.Empty; 

     for (int i = 0; i < Dt.Columns.Count; i++) 
     { 

      StrDc[i] = Dt.Columns[i].Caption; 

      HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\","; 
     } 

     HeadStr = HeadStr.Substring(0, HeadStr.Length - 1); 

     StringBuilder Sb = new StringBuilder(); 
     if (Name != "") 
     { 
      Sb.Append("{\"" + Dt.TableName + "\" : ["); 
     } 
     else 
     { 
      Sb.Append("["); 
     } 

     for (int i = 0; i < Dt.Rows.Count; i++) 
     { 

      string TempStr = HeadStr; 
      Sb.Append("{"); 

      for (int j = 0; j < Dt.Columns.Count; j++) 
      { 

       TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "¾", Dt.Rows[i][j].ToString().Replace("\r\n", "<br>").Replace("\r", "<br>").Replace("\n", "<br>").Replace("\"","")); 
      } 

      if (i < Dt.Rows.Count - 1) { Sb.Append(TempStr + "},"); } else { Sb.Append(TempStr + "}"); }; 
     } 

     Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length)); 
     if (Name != "") 
     { 
      Sb.Append("]}"); 
     } 
     else 
     { 
      Sb.Append("]"); 
     } 
       return Sb.ToString();  

    }  

JSON字符串输出

"\"{\\\"Sites\\\" : [{\\\"EQ_DESC\\\" : \\\"SIERRA India\\\",\\\"EQ_CODE\\\" : \\\"1\\\"},{\\\"EQ_DESC\\\" : \\\"SIERRA Dubai\\\",\\\"EQ_CODE\\\" : \\\"24\\\"},{\\\"EQ_DESC\\\" : \\\"SIERRA Malaysia\\\",\\\"EQ_CODE\\\" : \\\"99\\\"},{\\\"EQ_DESC\\\" : \\\"SIERRA US\\\",\\\"EQ_CODE\\\" : \\\"100\\\"},{\\\"EQ_DESC\\\" : \\\"Mars India\\\",\\\"EQ_CODE\\\" : \\\"110\\\"},{\\\"EQ_DESC\\\" : \\\"???\\\",\\\"EQ_CODE\\\" : \\\"151\\\"},{\\\"EQ_DESC\\\" : \\\"turkey\\\",\\\"EQ_CODE\\\" : \\\"2299\\\"},{\\\"EQ_DESC\\\" : \\\"SIERRA Infosys\\\",\\\"EQ_CODE\\\" : \\\"2331\\\"},{\\\"EQ_DESC\\\" : \\\"Infosys\\\",\\\"EQ_CODE\\\" : \\\"2338\\\"}]}\"" 

C#类(模型)

public class Site 
{ 
public string EQ_DESC { get; set; } 
public string EQ_CODE { get; set; } 
} 
public class RootObject 
{ 
public List<Site> Sites { get; set; } 
} 

现在Deserialising JSON到列表

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
       { 
        using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
        { 
         /* Deserializing json data from service */ 
         var jsoncontent = reader.ReadToEnd(); 
         string s = jsoncontent.ToString(); 

        var results = JsonConvert.DeserializeObject<RootObject>(s); 

输出:

var results = JsonConvert.DeserializeObject<Rootobject>(s); 

**我们已经试过这个较早,但它返回null **

var results = JsonConvert.DeserializeObject<List<site>>(s); 

上面的代码结果retun Null。

请建议我解决问题。

感谢

文卡塔斯

回答

0

你的JSON字符串输出为List<Site>RootObject类不是List<Site>,但包含List<Site>类型的属性Sites。你应该尝试这样的事:

解决方案一:

var results = JsonConvert.DeserializeObject<List<Site>>(s); 

解决方法二:

修改您的RootObject这样的:

public class RootObject : List<Site> 
{ 
    //Whatever you want 
} 

而且使用解串器像这个:

var results = JsonConvert.DeserializeObject<RootObject>(s); 

希望这有助于

编辑:这事测试

你为什么要返回一个JSON字符串?我的意思是,如果您使用序列化程序,则可以指定您的服务器将结果自动转换为JSON字符串,然后在请求和反序列化内检索流,就像您已经完成的一样。让我告诉我的机器上是什么在起作用:

FIRST:您的服务contrat接口:

[ServiceContract] 
public interface IServiceContract 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json)] 
     List<Site> getuserSite(String UserCode); 
} 

第二:服务合同执行

public class ServiceContract : IServiceContract 
{ 
    public List<Site> getuserSite(String UserCode) 
    { 
     //Do whatever you want that return a List<Site> 
    } 
} 

第三:你的模型

[DataContract] 
public class Site 
{ 
    [DataMember] 
    public string EQ_DESC { get; set; } 
    [DataMember] 
    public string EQ_CODE { get; set; } 
} 

第四:在您的客户端引用合同

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
{ 

     /* Deserializing json data from service */ 

     DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(List<Site>)); 
     var result= deserializer.ReadObject(response.GetResponseStream()); 
} 

你的数据在结果你将有对应的JSON名单后反序列化反应。我希望你能找到一种方法让它在你的代码中工作。如有需要请随时与我联系。

+0

我们已经尝试了您的建议,但未能将JSON字符串转换为List集合,并且它返回null。请检查更新的代码。 – Venkatesh

+0

@ user3167868第二种解决方案是否适合您? – jhontarrede

+0

是的。第二个解决方案解决得很好。感谢您的亲切帮助 – Venkatesh