gpt4 book ai didi

C# 将 HttpResponseMessage 反序列化为对象

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:05 24 4
gpt4 key购买 nike

我在将 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>"

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

最佳答案

好的,我在评论中的 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;
}
}

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

关于C# 将 HttpResponseMessage 反序列化为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32272638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com