2016-04-19 6 views
0

JSON文字列をデシリアライズしてカスタムクラスにしようとしています。私は反射を使用する必要があります。私はシリアル化し、HttpPutメソッドに送り、JSON文字列を逆シリアル化し、辞書フィールドを読む辞書を持っています。ここで私がこれまで持っているものです。JSON文字列をリフレクションを使用してクラスに逆シリアル化する

私はこのような辞書に値を入れている:

Dictionary<string, object> valuesToUpdate = new Dictionary<string, object>(); 
Person p = new Person(); 
p.personName = "OrigName"; 
p.age = "25"; 
p.isAlive = true; 
valuesToUpdate.Add("Person", p); 
valuesToUpdate.Add("Length", 64.0); 

を、私はこのようにそれをシリアル化するJSONを使用しています:

string jsonString = JsonConvert.SerializeObject(valuesToUpdate); 

私はそれから取りますjsonStringを呼び出し、それをREST API PUTメソッドに送信します。 PUTメソッドは、リフレクションを使用して辞書のKey値に基づいてカスタムオブジェクトのさまざまな変数を更新します(この例では、customObject.PersonおよびcustomObject.Lengthを更新しています)。

PUTの呼び出しは、次のようにjsonStringをデシリアライズ:私はnewFieldsを反復処理し、customObjectの「人」クラスを更新するためにリフレクションを使用したい

Dictionary<string, object> newFields = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString); 

。私はまた、JSONのPopulateObjectメソッドを使用して試してみたが、それは、このエラーを返し

Object of type Newtonsoft.Json.Linq.JObject' cannot be converted to type 'Person';

[HttpPut("/test/stuff")] 
public string PutContact([FromBody]dynamic jsonString) 
{ 
    Dictionary<string, object> newFields = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString); 
    foreach (var field in newFields) 
    { 
     Console.WriteLine("\nField key: " + field.Key); 
     Console.WriteLine("Field value: " + field.Value + "\n"); 

     PropertyInfo propInfo = typeof(Contact).GetProperty(field.Key); 
     Type propertyType = propInfo.PropertyType; 
     var value = propInfo.GetValue(contactToUpdate, null); 

     if (propertyType.IsClass) 
     { 
      propInfo.SetValue(contactToUpdate, field.Value, null); 
     } 
    } 
} 

これはエラーを生成します。これは、jsonStringを読み、私のHttpPut方法である

Newtonsoft.Json.JsonSerializationException: Cannot populate JSON object onto type 'Person'. Path 'personName', line 1....

基本的に、JSON文字列をクラス(私の場合はPersonクラス)に変換し、それをreflectionを使ってcustomObjectのPersonフィールドに設定するにはどうすればいいですか?

+0

['JsonConvert.PopulateObject()'](http://www.newtonsoft.com/json/help/html/PopulateObject.htm)を代わりに使用することを検討してください。たとえば、[Json.NETを使用して新しい部分JSONデータで既存のオブジェクトを変更する](https://stackoverflow.com/questions/27511675)を参照してください。 – dbc

+0

'PopulateObject()'が動作するはずです。例外の完全な 'ToString()'出力、 '完全な例 '(https://stackoverflow.com/help/mcve)を含む例外的な例外の詳細については、 Person'クラスとその例外を発生させるJSON? – dbc

+0

例外は、JsonConvertが複合型( 'Person')を' Person'のJObject intにデシリアライズするためです。 OPがjsonを 'Dictionary 'に非直列化するときに、それを認識する方法はありません。 – Xiaoy312

答えて

0
if (propertyType.IsClass) 
{ 
    propInfo.SetValue(contactToUpdate, ((JObject)field.Value).ToObject(propertyType), null); 
} 
+0

私はあなたのコードを試して、このエラーが発生します:メソッド 'Newtonsoft.Json.Linq.JToken.ToObject (Newtonsoft.Json.JsonSerializer)'の型引数は、その使用から推論できません。型引数を明示的に指定してみてください。 – Roka545

+0

Json.NETパッケージのバージョンは何ですか? – Xiaoy312

+0

私の間違い。それがインストールされていないようです。私は8.0.3をインストールしました。 – Roka545

関連する問題