RestSharp Deserialize 返回空属性,但 xml.deserialize 测试有效

Posted

技术标签:

【中文标题】RestSharp Deserialize 返回空属性,但 xml.deserialize 测试有效【英文标题】:RestSharp Deserialize returns empty properties but xml.deserialize test works 【发布时间】:2012-11-13 17:23:30 【问题描述】:

编辑:当我问这个问题时,我想尝试一些东西.. 我已经在请求上设置了 XmlNamespace 属性,并且成功了..

request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#";

但我真的不明白为什么......

下一个问题是让 RestSharp 将 xml 属性识别为对象属性


这个周末的大部分时间我都在处理这个问题,但我就是没搞定。

我正在尝试为 RestFul 网络服务 (MusicBrainz) 编写一个包装器。我正在使用一个简单的示例进行测试:获取一位艺术家的详细信息并将其放入自定义 Artist 对象中。

当我在 RestClient 上执行 Execute 时,它​​结束了,但我的对象属性为空.. 但是当我使用 XmlDeserializer 测试反序列化时,objectproperties 被填充(但不适用于与属性对应的属性,但我稍后会解决)

在响应的反序列化和将对象放入 response.data 之间会发生什么? 很可能这是我正在犯的“新手”错误,因为这是我使用 RestSharp 的第一步..

非常感谢您的帮助..

返回的 xml:

<metadata>
   <artist type="Group" id="f1548c5b-329e-4036-921c-02213a04b525">
       <name>Uriah Heep</name>
           <sort-name>Uriah Heep</sort-name>
           <country>GB</country>
           <life-span>
               <begin>1970</begin>
           </life-span>
    </artist>
</metadata>

我的班级:

public class Artist

    public int Id  get; set; 
    public string Type  get; set; 
    public string Name  get; set; 
    public string SortName  get; set; 
    public string Country  get; set; 


在下面的代码输出属性被填充

var output = xml.Deserialize<Artist>(response);

但是调用时同样的响应不填充属性

var response = client.Execute<T>(request);

完整代码(为了简单起见,我将测试代码放在了泛型方法中):

public T Execute<T>(RestRequest request) where T : new()

    var client = new RestClient();
    client.BaseUrl = BaseUrl;
    client.Authenticator = null;

    //does not fill properties 
    var response = client.Execute<T>(request);

    if (response.ErrorException != null)
    
        throw response.ErrorException;
    
    var xml = new XmlDeserializer();

    //fills properties
    var output = xml.Deserialize<Artist>(response);

    return response.Data;

【问题讨论】:

你找到了我感兴趣的解决方案 :-) @AndersBornholm。我已经很久没有在这个项目上做一些工作了。但就我的记忆而言,“解决方案”是在 RestSharp 请求上设置一个命名空间。如果你真的很绝望,我可以挖掘这个项目并仔细看看...... 其实我也很久没有从事我的项目了。如果我没记错的话,我用restsharp以外的东西解决了它:-) 【参考方案1】:

这是因为Execute 方法在收到响应后尝试协商它基于请求的 RootElement 和 XmlNamespace 属性并将它们复制XmlDeserializer

这是一个代码from RestClient:

     handler.RootElement = request.RootElement;
     handler.DateFormat = request.DateFormat;
     handler.Namespace = request.XmlNamespace;
     response.Data = handler.Deserialize<T>(raw);

如果您传递带有不匹配的 XmlNamespace 的 RestRequest,RestSharp 的 XmlDeserializer(在后台使用 XDocument)将无法将响应 XML 映射到对象属性,而您将获得默认/空值。

现在对于默认实现(当您手动创建 XmlDeserializer 时),如果您不设置 XmlNamespace,反序列化器将执行 自动检测,它基本上会忽略响应和映射中的所有命名空间所有属性仅按其名称。

见源码from XmlDeserializer:

     // autodetect xml namespace
     if (!Namespace.HasValue())
     
         RemoveNamespace(doc);
     

考虑到以上所有因素,很明显为什么在您使用此行将 XmlNamespace 属性显式设置为请求对象中的匹配命名空间后它开始工作:

     request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#";

Execute 方法将命名空间复制到反序列化器中,并将 XML 映射到适当的对象。

【讨论】:

我有同样的问题,除了数据是 JSON (***.com/questions/58492656/…)。不知道有没有类似的解决方案?

以上是关于RestSharp Deserialize 返回空属性,但 xml.deserialize 测试有效的主要内容,如果未能解决你的问题,请参考以下文章

使用 restsharp 反序列化 json 字符串

具有泛型返回类型的可空引用类型

页面重定向时 HttpWebRequest 和 Restsharp 不返回响应

如何将 JSON 返回反序列化为从 RestSharp 调用到 API 的对象数组?

使用 RestSharp 返回“状态代码:未找到”获取 PayPal 访问令牌

创建返回实现 serde::Deserialize 的值的函数时的生命周期错误