RestSharp序列化/反序列化命名转换
我正在尝试使用RestSharp包装Plivo API( 是的,我知道它已经完成 )。
但是,我找不到将API命名约定转换为我自己的方法,例如:
“呼叫”( https://www.plivo.com/docs/api/call/#make-an-outbound-call )至少需要:
to
, from
和answer_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中开箱即用的。 你有几个选择:
-
从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"}
但是,我不确定这个选项是如何彻底测试的,因为它是默认编译出来的。
-
使用不同的序列化程序(如支持属性重命名的Json.NET)手动序列化和反序列化。 要执行此操作,请参阅RestSharp – 使用Json.net序列化程序 ( 在此存档。)