2016-08-19 78 views
0

我正在使用RestSharp並希望JSON序列化具有DTO類名作爲根元素的請求。下面是一個例子DTO類:使用類名稱作爲根元素序列化對象

public class NewToken { 
    public string user_name { get; set; } 
    public string password { get; set; } 
    public string audience { get; set; } 
} 

我想生成爲請求:

{ "NewToken" : { "user_name": "asdf", "password": "asdfasdf", "audience": "test" }} 

我知道我可以使用匿名類如this,但有一個方法可以讓我這樣做自動使用類名作爲根元素?

下面是API客戶,更多的代碼片段:

public abstract class ApiBase 
    { 
     internal string _defaultServer = Properties.Settings.Default.DefaultServer; 
     internal int _defaultPort = Properties.Settings.Default.DefaultPort; 

     public T Execute<T>(RestRequest request) where T : new() 
     { 
      var client = new RestClient(); 
      client.AddHandler("application/json", new CustomJsonSerialiser()); 
      client.BaseUrl = new Uri($"https://{this._defaultServer}:{this._defaultPort}"); 
      client.CookieContainer = new CookieContainer(); 

      var response = client.Execute<T>(request); 
      return response.Data; 
     } 

     internal RestRequest CreateBasicRequest() 
     { 
      var request = new RestRequest(); 
      request.RequestFormat = DataFormat.Json; 
      request.JsonSerializer = new CustomJsonSerialiser(); 
      request.AddHeader("Accept", "application/json, application/binary"); 
      request.AddHeader("Content-Type", "application/json"); 
      return request; 
     } 

     internal RestRequest CreateAuthenticatedRequest(string tokenId) 
     { 
      var request = this.CreateBasicRequest(); 
      request.AddHeader("Authorization", $"Bearer {tokenId}"); 
      return request; 
     } 
    } 

public class SessionManager : ApiBase 
    { 

     public SessionManager() { } 

     public SessionManager(string server, int port) 
     { 
      this._defaultServer = server; 
      this._defaultPort = port; 
     } 

     public Token GetToken() 
     { 
      var request = this.CreateBasicRequest(); 
      request.Method = Method.POST; 
      request.Resource = "token"; 
      request.AddBody(new { NewToken = new NewToken() { user_name = "dotnet", password = "dotnetdotnet", audience = "api" } }); 
      var token = Execute<Token>(request); 
      return token; 
     } 

     public Token RenewToken(Token token) 
     { 
      var request = this.CreateAuthenticatedRequest(token.id); 
      request.Method = Method.POST; 
      request.Resource = "token-renew"; 
      var new_token = Execute<Token>(request); 
      return new_token; 
     } 
    } 

SessionManager.GetToken()我創建一個匿名對象來獲取它正確序列化。我使用了一種自動化的方式,將一些東西集成到序列化過程中,將對象放在一個與DTO類同名的根元素中。

+0

從看您提供的鏈接,Json.Net可以添加的對象類型。你可以使用我的猜測? – Noctis

+0

如果'NewToken'中的屬性是自定義類型會發生什麼? '公共人員用戶{get;組; }'。那將如何被序列化? – Rob

回答

0

當您創建請求,請使用request.RootElement = "NewToken";

+0

很確定我試過,並沒有添加根元素。 – codedog

+0

@codedog你能提供更多有關致電休息服務的代碼嗎? –

+0

我已經添加了更多的代碼片斷,我希望這就夠了? – codedog