2016-08-19 3 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 было нестандартным? 'public Person User {get; задавать; } '. Как это будет сериализовано? – Rob

ответ

0

При создании запроса, используйте request.RootElement = "NewToken";

+0

Довольно уверен, что я пробовал это, и он не добавил корневой элемент. – codedog

+0

@codedog Можете ли вы предоставить больше кода о вызове службы отдыха? –

+0

Я добавил еще несколько фрагментов кода, надеюсь, этого достаточно? – codedog

Смежные вопросы