使用保留字作为变量名反序列化 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