Поведение именования свойств объектов HttpPost Json

#c# #json #asp.net-mvc #http-post

Вопрос:

Для функции HttpPost

 public async Tasklt;Resultgt; PostAsync([FromBody]Request request, [FromHeader(Name = "Cs-Auth")] string authKey=null)  {  try{  HttpResponseMessage response = await httpClient.PostAsJsonAsync(_config.ApiUrl, request);    response.EnsureSuccessStatusCode();   string responseText = await response.Content.ReadAsStringAsync();    Result result = JsonSerializer.Deserializelt;Resultgt;(responseText);   return ProcessResult(result);  }  catch(Exception e)  {  _logger.LogError(e.ToString());  throw;  }  }  

Класс запроса:

 public class Request  {  [JsonPropertyName("text")]  public string Text { get; set; }   [JsonPropertyName("user_id")]  public string user_id { get; set; }   [JsonPropertyName("rule_id")]  public string PolicyId { get; set; }   public Policy Policy {get; set;}  }  

Тело Json:

 {  "text": "sample",  "user_id": "3455643",  ...  }  

Но запрос, который я получил в PostAsync, выглядит так

введите описание изображения здесь

Я ожидал «текст», а не «Текст».

Я не хочу менять имя свойства «Текст» в классе запроса на «текст», что мне нужно сделать, чтобы определить поведение сериализации/десериализации?

Ответ №1:

Все работает правильно, ваш отладчик просто показывает данные ПЕРЕД изменением. попробуйте это в своем отладчике

 var jsonRequest= JsonConvert.SerializeObject(request);   var content = new StringContent(jsonRequest, Encoding.UTF8, "application/json");   var response = await client.PostAsync(_config.ApiUrl, content);  

Запрос json

 {  "text": "sample",  "user_id": "3455643",  ... }  

Комментарии:

1. Спасибо. Я думаю, что основная причина-PostAsJsonAsync(). Он преобразует объект в Json, но использует JsonSerializerDefaults. Веб, поэтому он может вести себя не так, как я хочу.

2. @Daolin Да, вы правы. Обычно я не использую PostAsJsonAsync . Я предпочитаю сериализовать явно перед отправкой.