编程语言
首页 > 编程语言> > C#-Flurl的PostUrlEncodedAsync忽略JsonProperty名称

C#-Flurl的PostUrlEncodedAsync忽略JsonProperty名称

作者:互联网

我正在使用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();

我的呼叫失败,因为它想要“密钥”,但我正在发送“ 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编码一起使用是不合理的,因为URL编码与JSON无关.

您可以通过投影到一个匿名对象上来轻松解决此问题:

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

不是那么干净或类型安全,但是我一直发现这是可以接受的,因为平均而言,URL编码的数据往往比JSON负载更小/更平坦/更简单.

标签:json-net,flurl,c
来源: https://codeday.me/bug/20191211/2106586.html