【问题标题】:JSON.NET deserialize to object with Type parameterJSON.NET 反序列化为带有 Type 参数的对象
【发布时间】:2013-02-17 04:04:15
【问题描述】:

我有以下我无法解决的问题:

我有不同的类,它们都实现了一个名为IProtocol 的接口。目前,它们被命名为SimpleProtocolParallelProtocol。我想保留这些对象,所以我使用了 JSON.NET,一切正常。除非我试图反序列化它们,否则当我知道它们应该是什么类型时它可以完美运行,例如:

SimpleProtocol p = JsonConvert.DeserializeObject<SimpleProtocol>(myJsonData);

但是,我现在想要加载 JSON 数据并返回 IProtocol,但这是可以理解的,JSON 不允许这样做;例如,这样的事情工作:

IProtocol p1 = JsonConvert.DeserializeObject<IProtocol>(myJsonData); // does not work
IProtocol p2 = (IProtocol)JsonConvert.DeserializeObject(myJsonData); // also, does not work

所以,查找API 我发现了这个方法签名:

public static Object DeserializeObject(
    string value,
    Type type
)

这看起来就像我需要的东西,所以尝试将类型保存在字符串中并检索它:

// test
Type protocolType = Type.GetType("MyApp.Protocols.SimpleProtocol");
IProtocol p1 = JsonConvert.DeserializeObject(myJsonData, protocolType);

我收到一个错误,无法将 Newtonsoft.Json.Linq.JObject 转换为 IProtocol。这很奇怪,我不知道如何解决。

不可能在泛型方法中传递Type对象,所以我基本上卡在这里。有没有办法解决这个问题,最好不使用反射?在我看来,这是一个完全正常的用例。

我能做的是创建一个简单的包装类,其中包含一个 IProtocol 实例并对其进行序列化/反序列化,但对我来说似乎有点“脏”?

【问题讨论】:

标签: c# types casting json.net deserialization


【解决方案1】:

看来我最初使用这种方法的方法毕竟是正确的:

public static Object DeserializeObject(
    string value,
    Type type
)

问题是我将我的对象类型坚持为使用MyProtocol.GetType().FullName,这导致了一个来自

的值

Type protocolType = Type.GetType(PersistedTypeString);

成为具有null 值的类型。但是,通过使用 MyProtocol.GetType().AssemblyQualifiedName 一切正常(p.s. 这也包含在 Type.GetType() 的文档中)

这是我的代码示例:

Type ProtocolType = Type.GetType(MetaData["ProtocolType"]);
var Protocol = JsonConvert.DeserializeObject(Data["Protocol"], 
                                             ProtocolType, 
                                             JsonProtocolPersister.DefaultSettings);
return (IProtocol)Protocol;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多