2014-04-21 50 views
0

我有一个方法,我正在使用Json响应。由于这是一个线束的一部分,我将创建大量不同的数据对象,因此可以将其更通用化,因此我不必为每个创建的不同数据对象创建相同的代码。有没有办法让我的序列化方法更模块化?

[DataContract] 
class Stats 
{ 
    [DataMember] 
    public string StatusCode {get;set;} 
    [DataMember] 
    public int ProspectCount {get;set;} 
    [DataMember] 
    public int MessageCount {get;set;} 
    [DataMember] 
    public int NewListingCount {get;set;} 
    [DataMember] 
    public int ReminderCount {get;set;} 
    [DataMember] 
    public int MyListingCount {get;set;} 
    [DataMember] 
    public int OfficListingCount {get;set;} 

} 


public static Stats SendRequest(string requestUrl) 
{ 
    try 
    { 
     HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest; 
     using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
     { 
      if (response.StatusCode != HttpStatusCode.OK) 
       throw new Exception(String.Format(
       "Server error (HTTP {0}: {1}).", 
       response.StatusCode, 
       response.StatusDescription)); 
      DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Stats)); 
      object objResponse = jsonSerializer.ReadObject(response.GetResponseStream()); 
      Stats jsonResponse 
      = objResponse as Stats; 
      return jsonResponse; 
     } 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.Message); 
     return null; 
    } 
} 

我基本上希望能够无需重新创建sendRequest方法以创建第二和第三数据的合同。

回答

0

我结束了使用Json.NET的系列化件。这将做我需要的一切。所以,现在我的方法是这样的:

public static string ProcessRequest(string requestUrl) 
    { 
     try 
     { 
      HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest; 

      using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
      { 
       string responseContents; 
       if (response.StatusCode != HttpStatusCode.OK) 
        throw new Exception(String.Format(
        "Server error (HTTP {0}: {1}).", 
        response.StatusCode, 
        response.StatusDescription)); 

       Stream responseStream = response.GetResponseStream(); 
       using(StreamReader readStream = new StreamReader(responseStream)) 
       { 
        responseContents = readStream.ReadToEnd(); 
       } 

       return responseContents; 
      } 


     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
      return null; 
     } 
    } 

而在另一种方法序列化组件是一个简单的衬垫,是以响应作为一个字符串:

Stats results = JsonConvert.DeserializeObject<Stats>(response); 
0

两个选项:

1:请sendRequest方法在另一大类仅静态方法,并有一个需要调用它的每一个对象:

RequestSender.SendRequest(requestUrl). 

2:产生这个和其他您必须编写的类扩展了一个包含SendRequest(String requestUrl)方法的超类,以便它们可以通过继承访问同一方法。

0

通用方法的工作?签名可能是这样的:

public static T SendRequest<T>(string requestUrl) where T : class 

在方法体中,你将与T取代Stats

用法:

Stats response = RequestSender.SendRequest<Stats>("some URL"); 
OtherClass anotherResponse = RequestSender.SendRequest<OtherClass>("some other URL"); 
+0

甚至都没有考虑到。明天我会看看。 –

相关问题