【问题标题】:C# Deserializing HttpResponseMessage to ObjectC# 将 HttpResponseMessage 反序列化为对象
【发布时间】:2015-11-23 05:01:02
【问题描述】:

我在将 HttpResponseMessage 反序列化为对象时遇到了一些问题。 问题是当对象应该反序列化所有字段为空时,不会抛出异常。

HttpContent content = new StringContent(xml);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/xml");
HttpResponseMessage response = await client.PostAsync("URL", content).ConfigureAwait(false);
// Parse response
if (response.IsSuccessStatusCode)
{
    XmlSerializer serializer = new XmlSerializer(typeof(ResponseObject));
    Stream responseStream = await response.Content.ReadAsStreamAsync();
    ResponseObject responseObject = serializer.Deserialize(responseStream) as ResponseObject;

    //Possible example of wrong data
    Console.WriteLine(responseObject.Message);
}

[XmlRoot("response")]
public class ResponseObject
{
    [XmlElement("session")]
    public string Session { get; set; }

    [XmlElement("status")]
    public string Status { get; set; }

    [XmlElement("message")]
    public string Message { get; set; }
}

字符串形式的响应消息

"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>
<response>
    <val n=\"session\">SESSION ID</val>
    <val n=\"status\">201</val>
    <val n=\"message\">Created</val>
</response>"

我错过了什么吗?我对序列化/反序列化很陌生。 感谢指点。

【问题讨论】:

  • 会话、状态和消息是标签val的属性n的值。
  • ResponseObject 是否不需要一些 val 元素集合来匹配 XML?
  • 我多么愚蠢……这就是我试图重用旧项目中的代码的结果。我会在星期一回来工作的时候尝试一下。
  • 问题:我还没有时间测试任何东西,但我有一个问题。我想我应该使用带有 XmlElement("val") 的 List。但是当它被序列化时,我应该如何存储每个 xml 行的属性。我希望能够在列表中找到“会话”。有什么提示吗?

标签: c# asp.net .net serialization httpresponse


【解决方案1】:

好的,我在 cmets 中的 Eser 和 Biscuits 的帮助下解决了这个问题。

我试图重用代码,并没有真正想到响应消息的结构与早期项目不同。

我将我的 ResponseObject 更改为:

[XmlRoot("response")]
public abstract class ResponseObject
{
    [XmlIgnore]
    public bool Success { get; set; }

    [XmlIgnore]
    public string Session
    {
        get
        {
            var result = Values.FirstOrDefault(n => n.Name == "session");
            return result.Value;
        }
    }

    [XmlIgnore]
    public string Status
    {
        get
        {
            var result = Values.FirstOrDefault(n => n.Name == "status");
            return result.Value;
        }
    }

    [XmlIgnore]
    public string Message
    {
        get
        {
            var result = Values.FirstOrDefault(n => n.Name == "message");
            return result.Value;
        }
    }

    [XmlElement("val")]
    public List<ResponseXmlWrapper<string>> Values;
}

public class ResponseXmlWrapper<T>
{
    [XmlAttribute("n")]
    [JsonProperty("n")]
    public string Name { get; set; }

    [XmlText]
    [JsonProperty()]
    public T Value { get; set; }

    public ResponseXmlWrapper()
    {

    }

    public ResponseXmlWrapper(string attributeName, T value)
    {
        Name = attributeName;
        Value = value;
    }
}

我不知道这是否是最佳解决方案,但它确实有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-17
    • 2015-08-05
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多