【发布时间】:2015-04-29 23:58:31
【问题描述】:
我无法在我的客户端上反序列化 JSON 数据。它接收这样的 JSON 数据:
{
"WaitForClientMessagesResult": [
{
"__type": "KeepAliveMessage:#Data.WebGateway",
"MessageId": 1,
"Type": 0,
"PositionInQueue": -1
}
]
}
KeepAliveMessage 是WebResponseMessage 的派生类。该服务返回一个IEnumerable<WebResponseMessage>。
我遇到了这样的异常:
Newtonsoft.Json.JsonSerializationException:
无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.IEnumerable`1[ Red5Prototype.Models.WaitForClientMessagesResult]
因为该类型需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。
我尝试过多种方式调用反序列化:
WaitForClientMessagesResult deserialized = JsonConvert.DeserializeObject<WaitForClientMessagesResult>(keepAliveResult);WaitForClientMessagesResult[] deserialized = JsonConvert.DeserializeObject<WaitForClientMessagesResult[]>(keepAliveResult);IEnumerable<WebClientMessage> deserialized = JsonConvert.DeserializeObject<IEnumerable<WebClientMessage>>(keepAliveResult);
如果这些有效,则无。
我不确定如何在客户端构建我的类以使用 Json 反序列化器。
编辑: 我的基类是这样定义的:
[KnownType(typeof(KeepAliveMessage))]
[DataContract]
public abstract class WebClientMessage
{
public WebClientMessage() { }
[DataMember]
public int MessageId { get; set; }
[DataMember]
public WebClientMessageType Type { get; set; }
}
像这样使用 Keepalive:
[DataContract]
public class KeepAliveMessage : WebClientMessage
{
public KeepAliveMessage() { }
[DataMember]
public int PositionInQueue { get; set; }
}
我尝试让WebClientMessage 成为WaitForClientMessagesResult 的成员
[DataContract]
public class WaitForClientMessagesResult
{
public WaitForClientMessagesResult() {}
[DataMember]
WebClientMessage [] Messages;
}
那也没用。
【问题讨论】:
-
告诉我们
WaitForClientMessagesResult是如何声明的。 -
您需要使用
__type属性吗?如果是这样,这就有点复杂了 -
__type 字段来自网络服务,我无法更改。它正在使用 .NET 序列化。
-
"__type"属性是DataContractJsonSerializer格式化多态类型信息的方式。 Json.NET 使用完全不同的格式,which is hardcoded。您可能需要考虑切换到DataContractJsonSerializer,因为服务器似乎正在使用它来发送数据。 -
如果您需要继续使用 Json.NET,也许这个解决方案有效:stackoverflow.com/questions/9490345/…
标签: c# json deserialization