Flurl 的 PostUrlEncodedAsync 忽略 JsonProperty 名称
Flurl's PostUrlEncodedAsync is ignoring JsonProperty names
我正在使用 Flurl(我最喜欢的 API 之一)现在 post 表单数据到 url。我非常熟悉使用 'JsonProperty' 属性来命名键,并使用 c# 的标准大小写。
但是当我使用 PostUrlEncodedAsync 时,正常的 JsonProperty 代码不会转换为 'key',而是保持 'KeyName' 并且调用失败。
public class TokenTest
{
[JsonProperty("key")]
public string KeyName { get; set; }
}
所以我有点困惑,这不是开箱即用的。
var request = new TokenTest
{
KeyName = "ewr1-QuQ5jo88WfCpNPz2kTb8ES",
};
var result = await url.PostUrlEncodedAsync(request).ReceiveString();
我的呼叫失败,因为它想要 'key',但我正在发送 'KeyName'。 JsonProperty/DataMember 属性在过去一直有效,为什么在这里失败了?
当我处理这个问题时,它似乎源于此方法调用 DefaultUrlEncodedSerializer
进行序列化这一事实。此序列化程序忽略 JsonProperty 名称。
var urlEncodedContent = new CapturedUrlEncodedContent(request.Settings.UrlEncodedSerializer.Serialize(token));
var jsonEncodedContent = new CapturedUrlEncodedContent(request.Settings.JsonSerializer.Serialize(token));
例如,jsonEncodedContent 使用 JsonProperty
属性,而 urlEncodedContent 忽略该属性。
JsonProperty
,顾名思义,与JSON序列化有关。它实际上是一个 Json.NET 功能;它与 Flurl 一起工作的事实只是 Flurl 在其默认 JSON 序列化程序中使用 Json.NET 这一事实的一个方便结果。但我认为期望 JsonProperty
与 URL-encoding 一起工作是不合理的,因为 URL-encoding 与 JSON.[=13 无关=]
您只需投影到匿名对象上即可轻松解决此问题:
url.PostUrlEncodedAsync(new { key = token.KeyName });
不是那么干净或类型安全,但我一直认为这是可以接受的,因为平均而言,URL 编码数据往往是 smaller/flatter/simpler 而不是 JSON 有效载荷.
我正在使用 Flurl(我最喜欢的 API 之一)现在 post 表单数据到 url。我非常熟悉使用 'JsonProperty' 属性来命名键,并使用 c# 的标准大小写。
但是当我使用 PostUrlEncodedAsync 时,正常的 JsonProperty 代码不会转换为 'key',而是保持 'KeyName' 并且调用失败。
public class TokenTest
{
[JsonProperty("key")]
public string KeyName { get; set; }
}
所以我有点困惑,这不是开箱即用的。
var request = new TokenTest
{
KeyName = "ewr1-QuQ5jo88WfCpNPz2kTb8ES",
};
var result = await url.PostUrlEncodedAsync(request).ReceiveString();
我的呼叫失败,因为它想要 'key',但我正在发送 'KeyName'。 JsonProperty/DataMember 属性在过去一直有效,为什么在这里失败了?
当我处理这个问题时,它似乎源于此方法调用 DefaultUrlEncodedSerializer
进行序列化这一事实。此序列化程序忽略 JsonProperty 名称。
var urlEncodedContent = new CapturedUrlEncodedContent(request.Settings.UrlEncodedSerializer.Serialize(token));
var jsonEncodedContent = new CapturedUrlEncodedContent(request.Settings.JsonSerializer.Serialize(token));
例如,jsonEncodedContent 使用 JsonProperty
属性,而 urlEncodedContent 忽略该属性。
JsonProperty
,顾名思义,与JSON序列化有关。它实际上是一个 Json.NET 功能;它与 Flurl 一起工作的事实只是 Flurl 在其默认 JSON 序列化程序中使用 Json.NET 这一事实的一个方便结果。但我认为期望 JsonProperty
与 URL-encoding 一起工作是不合理的,因为 URL-encoding 与 JSON.[=13 无关=]
您只需投影到匿名对象上即可轻松解决此问题:
url.PostUrlEncodedAsync(new { key = token.KeyName });
不是那么干净或类型安全,但我一直认为这是可以接受的,因为平均而言,URL 编码数据往往是 smaller/flatter/simpler 而不是 JSON 有效载荷.