Newtonsoft.Json: DeserializeObject(string value, Type type)

本文关键字:Type type value string Json DeserializeObject Newtonsoft | 更新日期: 2023-09-27 18:35:55

我正在使用 SignalR 来接收类型名称和 Json,目前我已经通过在服务器上使用管道符号连接来相对天真地实现:

var ctx = GlobalHost.ConnectionManager.GetConnectionContext<MyConnection>();
ctx.Connection.Broadcast(message.GetType().FullName + "|" + JsonConvert.SerializeObject(message));

在客户端上,我正在尝试反序列化回正确的类型,但当然不能在JsonConvert上使用任何泛型方法,所以我想出了这个:

var pipePos = eventMessageString.IndexOf("|", StringComparison.Ordinal);
var typeName = eventMessageString.Substring(0, pipePos);
var eventJson = eventMessageString.Substring(pipePos + 1);
var eventType = Type.GetType(typeName);
var evt = JsonConvert.DeserializeObject(eventJson, eventType);

唯一的麻烦是evt是一个Newtonsoft.Json.Linq.JObject,而实际上它应该是eventType类型的实例。

有没有更好的方法来做到这一点,或者至少有一个解决方案来让它工作?我觉得我错过了一些显而易见的东西——也许我已经盯着它太久了?

提前非常感谢。

Newtonsoft.Json: DeserializeObject(string value, Type type)

eventType 是非空的吗?调用 Type.GetType 时,需要该类型的程序集限定名称。