Связывание базовой модели.NET с именами атрибутов через дефис в пост-запросе
Я подписался на услугу Nexmo SMS, и они предлагают URL обратного вызова для входящих SMS. Почтовый запрос дает следующую структуру Json при уведомлении о получении SMS:
{
"msisdn": "441632960960",
"to": "441632960961",
"messageId": "02000000E68951D8",
"text": "Hello7",
"type": "text",
"keyword": "HELLO7",
"message-timestamp": "2016-07-05 21:46:15"
}
Используя следующий фрагмент кода, я могу сопоставить все поля с моим SmsReceipt, кроме 'message-timestamp'. Ни одно из полей отметки времени сообщения не заполняется.
public class SmsReceipt
{
public string msisdn { get; set; }
public string to { get; set; }
public string messageId { get; set; }
public string text { get; set; }
public string type { get; set; }
public string keyword { get; set; }
public string messagetimestamp { get; set; }
public string messageTimestamp { get; set; }
public string message_timestamp { get; set; }
}
[HttpPost("inboundsms")]
public async Task<IActionResult> Post([FromBody] SmsReceipt receipt)
{
return StatusCode(200);
}
Я предполагаю, что то же самое относится к входящим запросам с другими специальными символами, такими как '.' Любые идеи с благодарностью.
1 ответ
Ваше имя свойства должно совпадать с именем свойства в отправляемых данных. Похоже, ваше имя полезной нагрузки message-timestamp
, Вы не можете создать свойство C# с -
в этом. Так что ваши варианты
Либо обновите свойство полезной нагрузки json, чтобы оно соответствовало вашему классу C#.
Украсьте свой класс C#
JsonProperty
(Из Newtonsoft.Json), где вы указываете, какое свойство из опубликованных данных должно быть сопоставлено с этим свойством.
Также я предлагаю использовать DateTime
тип. Этот тип был создан для работы со значением даты и времени.
public class SmsReceipt
{
public string Msisdn { get; set; }
public string To { get; set; }
public string MessageId { get; set; }
public string Text { get; set; }
public string Type { get; set; }
public string Keyword { get; set; }
[JsonProperty("message-timestamp")]
public DateTime Messagetimestamp { get; set; }
}