使用保留字作为变量名反序列化 url-encoded-form-data
Deserializing url-encoded-form-data with reserved word as variable name
我目前正在用 c# 构建一个 webhook,我应该接收的变量之一称为“事件”,它是 c# 中的保留字。我怎样才能告诉控制器将其反序列化为不同的变量名。我尝试像使用 JSON(下图)那样进行操作,但没有成功。
public class WaiverPosted
{
public string unique_id { get; set; }
public string credential { get; set; }
[JsonPropertyName("event")]
public string _event { get; set; }
}
编辑澄清:数据以www-url-form-encoded数据的形式出现。这是反序列化的方法header。
[HttpPost]
[Route("createcustomer")]
public async Task<IActionResult> CreateCustomer([FromForm] WaiverPosted input)
{
//DO SOMETHING
}
您的代码在我测试时似乎运行良好。这是我的版本:
using System.Text.Json;
using System.Text.Json.Serialization;
var json = @"{
""unique_id"": ""12345678"",
""credential"": ""username-and-password"",
""event"": ""some-event-value""
}";
var result = JsonSerializer.Deserialize<WaiverPosted>(json);
Console.WriteLine(result?.unique_id);
Console.WriteLine(result?.credential);
Console.WriteLine(result?._event);
public class WaiverPosted
{
public string? unique_id { get; set; }
public string? credential { get; set; }
[JsonPropertyName("event")]
public string? _event { get; set; }
}
输出:
12345678
username-and-password
some-event-value
诀窍是告诉编译器不要将该名称视为保留关键字 event
,而您使用 at-sign 来做到这一点,如下所示:
public string @event { get; set; }
现在,您可能认为这类似于使用下划线,但这是不正确的。 at-sign 实际上不会成为事件名称的一部分,它只是告诉编译器不要将下一个单词视为保留关键字,而是将其视为标识符。
另请注意,无论您在何处要引用此 属性,您可能都必须继续使用 at-sign 前缀,否则该引用也不会编译。
这是一个例子:
void Main()
{
Console.WriteLine(nameof(@event));
Console.WriteLine(nameof(_event));
}
public string @event { get; set; }
public string _event { get; set; }
将输出:
event
_event
我目前正在用 c# 构建一个 webhook,我应该接收的变量之一称为“事件”,它是 c# 中的保留字。我怎样才能告诉控制器将其反序列化为不同的变量名。我尝试像使用 JSON(下图)那样进行操作,但没有成功。
public class WaiverPosted
{
public string unique_id { get; set; }
public string credential { get; set; }
[JsonPropertyName("event")]
public string _event { get; set; }
}
编辑澄清:数据以www-url-form-encoded数据的形式出现。这是反序列化的方法header。
[HttpPost]
[Route("createcustomer")]
public async Task<IActionResult> CreateCustomer([FromForm] WaiverPosted input)
{
//DO SOMETHING
}
您的代码在我测试时似乎运行良好。这是我的版本:
using System.Text.Json;
using System.Text.Json.Serialization;
var json = @"{
""unique_id"": ""12345678"",
""credential"": ""username-and-password"",
""event"": ""some-event-value""
}";
var result = JsonSerializer.Deserialize<WaiverPosted>(json);
Console.WriteLine(result?.unique_id);
Console.WriteLine(result?.credential);
Console.WriteLine(result?._event);
public class WaiverPosted
{
public string? unique_id { get; set; }
public string? credential { get; set; }
[JsonPropertyName("event")]
public string? _event { get; set; }
}
输出:
12345678
username-and-password
some-event-value
诀窍是告诉编译器不要将该名称视为保留关键字 event
,而您使用 at-sign 来做到这一点,如下所示:
public string @event { get; set; }
现在,您可能认为这类似于使用下划线,但这是不正确的。 at-sign 实际上不会成为事件名称的一部分,它只是告诉编译器不要将下一个单词视为保留关键字,而是将其视为标识符。
另请注意,无论您在何处要引用此 属性,您可能都必须继续使用 at-sign 前缀,否则该引用也不会编译。
这是一个例子:
void Main()
{
Console.WriteLine(nameof(@event));
Console.WriteLine(nameof(_event));
}
public string @event { get; set; }
public string _event { get; set; }
将输出:
event
_event