2016-07-15 5 views
2

JSONから動的に作成される動的オブジェクト(実際にはJSON.NETのJObject)があります。 プロパティを既存のオブジェクトにコピーしたいと思っています。動的オブジェクトのプロパティがターゲットオブジェクトの型に存在する必要があります。存在しない場合は、エラーが発生しても問題ありません。 私はAutomapper、最新版を見ています。 JObjectから適切な型にマップを作成しようとしましたが、JObjectのプロパティが内部ディクショナリに格納されているため、動作しないと思います。 これはまったく可能ですか?Automapperを使用して動的からプロパティをコピーする

答えて

4

はい、可能です。

すでにJObjectがある場合は、Automapperを使用してプロパティを既存のターゲットオブジェクトにコピーする必要はありません。 Json.Netシリアライザはこれを行うPopulateObject()メソッドを提供します。

jObj.PopulateObject<Foo>(existingFoo); 

注:あなたはこれを行うことができますプロパティをコピーする必要がある時はいつでも、次に

using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

public static class JsonExtensions 
{ 
    public static void PopulateObject<T>(this JToken jt, T target) 
    { 
     JsonSerializer serializer = new JsonSerializer(); 
     serializer.Populate(jt.CreateReader(), target); 
    } 
} 

:あなたはそれが簡単に右JOBJECTから呼び出すために作るために拡張メソッドを作成することができますあなたの変数場合ここで

((JObject)jObj).PopulateObject<Foo>(existingFoo); 

は、cを証明するための簡単なデモです:それは、jオブジェクトは、ランタイムバインダーは、拡張メソッドを見つけることができるので、あなたはそれをキャストする必要がありますdynamicとして宣言されて保持していますoncept:https://dotnetfiddle.net/dhPDCj

Automapperを使用する方がいい場合は、通常のメンバーベースのマッピングではなく、この同じ変換を実行するように設定できます。トリックは、マッピングを設定するときConvertUsingメソッドを使用することです:

Mapper.Initialize(cfg => cfg.CreateMap<JObject, Foo>().ConvertUsing((jo, foo) => 
{ 
    JsonSerializer serializer = new JsonSerializer(); 
    serializer.Populate(jo.CreateReader(), foo); 
    return foo; 
})); 

[プロパティコピーするには、このコードを使用:いいえ

Mapper.Map<JObject, Foo>(jObj, existingFoo); 
+0

を...私は明示的に私がTJEプロパティをコピーするwated言っ*既存*オブジェクト! –

+0

申し訳ありませんが、私は何とかあなたの質問の詳細を逃した。私は私の答えを更新しました。 –

関連する問題