RestSharp序列化/反序列化命名转换

我正在尝试使用RestSharp包装Plivo API( 是的,我知道它已经完成 )。

但是,我找不到将API命名约定转换为我自己的方法,例如:

“呼叫”( https://www.plivo.com/docs/api/call/#make-an-outbound-call )至少需要:

tofromanswer_url参数。

这些参数也区分大小写。

我希望能够提供一个CallRequest类,包装我首选命名约定中所需的数据,然后以某种方式在RestSharp序列化之前转换它们。

例:

 public class CallRequest { ///  /// The phone number to be used as the caller id (with the country code).For eg, a USA caller id number could be, 15677654321, with '1' for the country code. ///  public string From { get; set; } ///  /// The regular number(s) or sip endpoint(s) to call. Regular number must be prefixed with country code but without the + sign). For eg, to dial a number in the USA, the number could be, 15677654321, with '1' for the country code. Multiple numbers can be sent by using a delimiter. For eg 15677654321<12077657621<12047657621. Sip endpoints must be prefixed with sip: Eg, sip:john1234@phone.plivo.com. To make bulk calls, the delimiter < is used. For eg. 15677654321<15673464321<sip:john1234@phone.plivo.com Yes, you can mix regular numbers and sip endpoints. ///  public string To { get; set; } ///  /// The URL invoked by Plivo when the outbound call is answered. ///  public string AnswerUrl { get; set; } } 

然后,这些数据将在以下函数中转换为Plivo的约定:

  private T Execute(IRestRequest request) where T : new() { var client = new RestClient { BaseUrl = new Uri(BaseUrl), Authenticator = new HttpBasicAuthenticator(_accountId, _authToken), UserAgent = "PlivoSharp" }; request.AddHeader("Content-Type", "application/json"); request.AddParameter("auth_id", _accountId, ParameterType.UrlSegment); request.RequestFormat = DataFormat.Json; client.AddHandler("application/json", new JsonDeserializer()); var response = client.Execute(request); if (response.ErrorException == null) return response.Data; const string message = "Error retrieving response. Check inner details for more info."; var plivoException = new ApplicationException(message, response.ErrorException); throw plivoException; } public CallResponse MakeCall(CallRequest callRequest) { var request = new RestRequest { RequestFormat = DataFormat.Json, Resource = "Account/{auth_id}/Call/", Method = Method.POST }; //SOMEHOW TRANSLATE THE PROPERTIES INTO THE DATA BELOW request.AddBody(new { to = "17#####", from = "18#####", answer_url = "http://m------.xml" }); return Execute(request); } 

不幸的是,看起来好像JSON属性重命名不是在RestSharp中开箱即用的。 你有几个选择:

  1. 从https://github.com/restsharp/RestSharp下载Restsharp并自行重建,启用编译器选项SIMPLE_JSON_DATACONTRACT 。 然后,您将能够使用数据协定属性重命名属性。 有关更多信息,请参阅此处: RestSharp JsonDeserializer,标识符中包含特殊字符

    我刚刚重建了最新版本的RestSharp(版本105.1.0)并启用了此选项。 使用以下版本的课程:

     [DataContract] public class CallRequest { [DataMember(Name = "from")] public string From { get; set; } [DataMember(Name = "to")] public string To { get; set; } [DataMember(Name = "answer_url")] public string AnswerUrl { get; set; } } 

    我能够生成以下JSON:

      var request = new CallRequest { AnswerUrl = "AnswerUrl", From = "from", To = "to" }; var json = SimpleJson.SerializeObject(request); Debug.WriteLine(json); // Prints {"from":"from","to":"to","answer_url":"AnswerUrl"} 

    但是,我不确定这个选项是如何彻底测试的,因为它是默认编译出来的。

  2. 使用不同的序列化程序(如支持属性重命名的Json.NET)手动序列化和反序列化。 要执行此操作,请参阅RestSharp – 使用Json.net序列化程序 ( 在此存档。)