【问题标题】:RestSharp Serialize/Deserialize Naming ConversionRestSharp 序列化/反序列化命名转换
【发布时间】:2015-05-04 18:31:23
【问题描述】:

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

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

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

提供tofromanswer_url 参数。

这些参数也区分大小写。

我希望能够提供一个 CallRequest 类,以我喜欢的命名约定包装所需的数据,然后在 RestSharp 序列化之前以某种方式翻译这些数据。

例子:

public class CallRequest
{

    /// <summary>
    /// The phone number to be used as the caller id (with the country code).For e.g, a USA caller id number could be, 15677654321, with '1' for the country code.
    /// </summary>
    public string From { get; set; }

    /// <summary>
    ///  The regular number(s) or sip endpoint(s) to call. Regular number must be prefixed with country code but without the + sign). For e.g, 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 e.g. 15677654321<12077657621<12047657621. Sip endpoints must be prefixed with sip: E.g., 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.
    /// </summary>
    public string To { get; set; }

    /// <summary>
    /// The URL invoked by Plivo when the outbound call is answered.
    /// </summary>
    public string AnswerUrl { get; set; }

}

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

    private T Execute<T>(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<T>(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<CallResponse>(request);
    }

【问题讨论】:

    标签: c# json serialization restsharp plivo


    【解决方案1】:

    不幸的是,看起来 JSON 属性重命名似乎没有在 RestSharp 中开箱即用地实现。您有两种选择:

    1. https://github.com/restsharp/RestSharp 下载Restsharp 并启用编译器选项SIMPLE_JSON_DATACONTRACT 自己重建它。然后,您将能够使用数据协定属性重命名属性。更多信息,请看这里:RestSharp JsonDeserializer with special characters in identifiers

      我刚刚重建了最新版本的 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 - using the Json.net serializer(存档here。)

    【讨论】:

    • 你先生真是天赐之物...我只花了 119 行代码创建和对象与文档:puu.sh/hBDpI/40f072f800.png - 然后我使用反射来弄清楚如何处理每个对象。 puu.sh/hBDrq/84ee1d8b47.png 谢天谢地,在我走得更远之前我看到了你的帖子!他们绝对应该在 NuGet 版本中将此作为选项!
    • 我确实注意到 IsRequired 被忽略了,这并不太糟糕,但令人失望。 =\
    • 坦率地说,这很荒谬。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多