Flurl的PostUrlEncodedAsync忽略了JsonProperty名称

时间:2019-01-31 14:25:02

标签: c# json.net flurl

我正在使用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忽略该属性。

1 个答案:

答案 0 :(得分:2)

顾名思义,

JsonProperty与JSON序列化有关。它实际上是Json.NET的功能。它的工作原理与Flurl事实是那Flurl在其默认的JSON序列使用Json.NET其实只是一个方便的后果。但我认为期望JsonProperty可以与URL编码一起使用是不合理的,因为URL编码与JSON无关。

您可以解决此很容易地通过只是投影到一个匿名对象:

url.PostUrlEncodedAsync(new { key = token.KeyName });

不作为清洁或类型安全,但我总是发现因为URL编码数据往往较小/较平比JSON有效载荷/简单平均。

这是可以接受的