2016-07-28 72 views
1

此代码:无法投射型 'Newtonsoft.Json.Linq.JObject' 的目的是键入<MyClass>

var commandMessage = new CommandMessage { CorrelationId = Guid.NewGuid() }; 
var json = JsonConvert.SerializeObject(commandMessage); 
var myCommandMessage = (CommandMessage)JsonConvert.DeserializeObject(json); 

给出了这样的错误消息:

Additional information: Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'QueueConnectionStringTester.CommandMessage' 

这是对CommandMessage类:

public class CommandMessage 
{ 
    public Guid CorrelationId { get; set; }   
} 

我在这里错过了什么?

+0

你可以显示你的'CommandMessage'类吗? –

+0

是的,我发布了CommandMessage类的代码。它有:-) –

+0

为什么不只是使用'JsonConvert.DeserializeObject(json,commandMessage.GetType());'?看起来像那是什么文件要你做:http://www.newtonsoft.com/json/help/html/Overload_Newtonsoft_Json_JsonConvert_DeserializeObject.htm – KreepN

回答

6

您需要指定反序列化时的类型。

或者:

var myCommandMessage = JsonConvert.DeserializeObject<CommandMessage>(json); 

或者:

var myCommandMessage = (CommandMessage)JsonConvert.DeserializeObject(json, typeof(CommandMessage)); 
+0

好,简单的答案。出于兴趣:当使用非泛型'JsonConvert.DeserializeObject()'方法时,返回什么类型?它是一个“对象”,还是使用通用签名中的“T”类型?在这种情况下,'T'会是什么 - 'null'? –

+1

@GeoffJames DeserializeObject的非通用版本返回'object',然后您需要将其转换为您期望的类型,如上面我的回答(第二个示例)所示。如果你在没有类型参数的情况下使用重载(如OP所做的那样),那么JObject将被返回。 –

1

你需要给类型。 JsonConvert类不知道任何有关您的CommandMessage类

public class CommandMessage 
    { 
     public Guid CorrelationId { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     var commandMessage = new CommandMessage { CorrelationId = Guid.NewGuid() }; 
     var json = JsonConvert.SerializeObject(commandMessage); 
     var myCommandMessage = JsonConvert.DeserializeObject<CommandMessage>(json); 
    } 
相关问题