2016-08-19 20 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; } 
} 

は私があることを、生成要求たい:私は、このようなthisとして匿名クラスを使用することができます実現

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

を、私はこれを自動的に行うことができます方法はありクラス名をルート要素として使用していますか?

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()で、私はそれを正しくシリアライズ取得する匿名のオブジェクトを作成しています:

はここAPIクライアントのためのいくつかのより多くのコードスニペットです。私は自動化された方法の後で、DTOクラスと同じ名前のルート要素にオブジェクトをラップするシリアル化プロセスに統合されたものです。

+0

を使用し、Json.Netは、オブジェクトタイプを追加することができます。私はそれを使用することができると思いますか? – Noctis

+0

'NewToken'のプロパティがカスタムタイプの場合はどうなりますか? 'public Person User {get;セット; } '。どのようにシリアル化されますか? – Rob

答えて

0

あなたが要求を作成するときに、あなたが与えてきたリンクを見てからrequest.RootElement = "NewToken";

+0

かなり試してみましたが、ルート要素を追加していませんでした。 – codedog

+0

@codedog電話をかけるサービスについてもっと多くのコードを提供できますか? –

+0

もっとコードスニペットを追加しましたが、これで十分ですか? – codedog

関連する問題