3

我有一个从 JSON 动态构建的动态对象(实际上是来自 JSON.NET 的 JObject)。我想将其属性复制到现有对象。动态对象的属性应该存在于目标对象的类型中,如果不存在,则可以出错。为此,我正在查看最新版本的 Automapper。我试图创建从 JObject 到正确类型的映射,但我认为它不会起作用,因为 JObject 中的属性存储在内部字典中。这可能吗?

4

1 回答 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 回答