2016-07-28 5 views
1

このコード:入力するタイプ 'Newtonsoft.Json.Linq.JObject' のオブジェクトをキャストすることができません<MyClass>

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

これはのCommandMessageクラスは次のとおりです:

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

は、このエラーメッセージを表示します

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 = (CommandMessage)JsonConvert.DeserializeObject(json, typeof(CommandMessage)); 
+0

ニース、簡単な答え。ちょうど興味がありません:ジェネリックでない 'JsonConvert.DeserializeObject()'メソッドを使うとき、どんな型が返されますか?それは 'オブジェクト'ですか、それともジェネリックシグネチャから 'T'の型を使用していますか?この場合、 'T'は' 'ヌル' 'となるでしょうか? –

+1

@GeoffJames DeserializeObjectのジェネリックでないバージョンは 'object'を返します。これは上記の私の答え(2番目の例)に示すように、あなたが期待している型にキャストする必要があります。型パラメータなしでオーバーロードを使用すると(OPが実行していたとき)、JObjectが返されます。 –

1

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

または:どちらか

。 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); 
    } 
関連する問題