2016-08-19 42 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

相关问题