2016-07-28 33 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); 
    } 
相關問題