我有一个从 JSON 动态构建的动态对象(实际上是来自 JSON.NET 的 JObject)。我想将其属性复制到现有对象。动态对象的属性应该存在于目标对象的类型中,如果不存在,则可以出错。为此,我正在查看最新版本的 Automapper。我试图创建从 JObject 到正确类型的映射,但我认为它不会起作用,因为 JObject 中的属性存储在内部字典中。这可能吗?
问问题
2804 次
1 回答
10
是的,这是可能的。
如果您已经有一个JObject
,那么您真的不需要 Automapper 将属性从它复制到您现有的目标对象。Json.Net 序列化程序提供了一种Populate()
方法来执行此操作。您可以创建一个扩展方法,以便从以下位置轻松调用JObject
:
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);
}
}
然后,每当您需要复制属性时,您都可以这样做:
jObj.PopulateObject<Foo>(existingFoo);
注意:如果你的变量JObject
被声明为,dynamic
那么你将不得不强制转换它,以便运行时绑定器可以找到扩展方法:
((JObject)jObj).PopulateObject<Foo>(existingFoo);
这是一个快速演示来证明这个概念: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);
于 2016-07-15T15:15:39.417 回答