我正在使用一个冒险团队的REST API。他们提供了两个端点,两者返回相似但不相等的响应。我正在使用DataContractJsonSerializer
对响应进行反序列化。
终点A响应:
{
"message": "Hello World."
}
终点B应答:
{
"message": [
"Hello World.",
"Hello StackOverflow."
]
}
可以看到,端点A在message
属性中提供了一个字符串,而端点B提供了一个字符串数组。
我真的很想使用相同的DataContract
,但有没有办法做到这一点?
[DataContract]
public class Response
{
[DataMember(Name = "message")]
public string Message { get; set; } // Changing this to string[] fails as well.
}
当然,我得到了一个错误:
反序列化Response类型的对象时出错。应为命名空间“”中的结束元素“message”。在命名空间“”中找到元素“item”。
为了完整起见,这里是代码:
string jsonPayload = "{ 'Random': 'Payload' }";
HttpClient myHttpClient = getHttpClient();
HttpResponseMessage responseMsg = await myHttpClient.PostAsync("myApiPath", new StringContent(jsonPayload));
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Response));
string rspJson = await responseMsg.Content.ReadAsStringAsync();
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(rspJson));
Response rsp = (Response)serializer.ReadObject(ms);
1条答案
按热度按时间ma8fv8wu1#
DataContractJsonSerializer
内置了对多态原语和原语数组的支持,因此如果将Messages
属性声明为object
,则可以反序列化JSON:演示小提琴#1 here。
这个模型并没有真正捕捉到
Message
应该是一个字符串或字符串数组的事实,所以你可能更喜欢使用一些替代属性来进行序列化,如下所示:请注意根据文件
对于大多数涉及序列化为JSON和从JSON反序列化的场景,我们推荐使用APIs in the System.Text.Json namespace。
演示小提琴#2 here。