RestSharp 中的对象到 JSON 问题

Ant*_*ony 4 c# restsharp

我正在使用的 Rest API 有一个名为 Api-Key 的新字段。这不是有效的 C# 字段名称,因此我想知道是否有不同的方式来构建主体。

   var client = new RestClient("https://TestWeb");

        var request = new RestRequest("login", Method.POST);
        request.AddHeader("Content-type", "application/json");

        request.AddJsonBody(
           new {
               credentials =
            new
            {
                username = "Uname",
                password = "password",
                Api-Key = "apikey"
            } }); 
Run Code Online (Sandbox Code Playgroud)

Fra*_*zzi 6

由于RestSharp使用默认的 Json 序列化器SimpleJson,据我所知,它不支持属性来更改序列化行为,所以我会:

  1. 安装为 NuGet 包Newtonsoft Json,以便使用其JsonProperty属性。

  2. 定义一个类来提供身份验证对象,如下所示:

    public class AuthenticationInfos
    {
        [JsonProperty(PropertyName = "username")]
        public string Username { get; set; }
    
        [JsonProperty(PropertyName = "password")]
        public string Password { get; set; }
    
        [JsonProperty(PropertyName = "Api-Key")]
        public string ApiKey { get; set; }
    }
    
    Run Code Online (Sandbox Code Playgroud)

(关键部分在这里[JsonProperty(PropertyName = "Api-Key")],您告诉序列化程序使用该名称序列化该属性,这作为 C# 变量是无效的)

  1. 使用Newtonsoft Json序列化来序列化body请求:

    var client = new RestClient("https://TestWeb");
    
    var request = new RestRequest("login", Method.POST);
    request.AddHeader("Content-type", "application/json");
    
    var body = new
    {
        credentials =
            new AuthenticationInfos()
            {
                Username = "Uname",
                Password = "password",
                ApiKey = "myApiKey"
            }
    };
    
    var serializedBody = JsonConvert.SerializeObject(body);
    request.AddParameter("application/json", serializedBody, ParameterType.RequestBody);
    
    Run Code Online (Sandbox Code Playgroud)

身体会是这样的:

{
    "credentials":
    {
        "username": "Uname", 
        "password": "password",
        "Api-Key": "myApiKey"
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,在接收消息时,您必须在反序列化阶段进行相同的操作。