我正在使用Flurl(我最喜欢的API之一)将表单数据发布到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忽略该属性。
答案 0 :(得分:2)
JsonProperty
与JSON序列化有关。它实际上是Json.NET的功能。它的工作原理与Flurl事实是那Flurl在其默认的JSON序列使用Json.NET其实只是一个方便的后果。但我认为期望JsonProperty
可以与URL编码一起使用是不合理的,因为URL编码与JSON无关。
您可以解决此很容易地通过只是投影到一个匿名对象:
url.PostUrlEncodedAsync(new { key = token.KeyName });
不作为清洁或类型安全,但我总是发现因为URL编码数据往往较小/较平比JSON有效载荷/简单平均。
这是可以接受的