如何使用Automapper将JSON字段映射到POCO

时间:2014-08-12 20:21:11

标签: c# json mapping automapper

是否可以使用Automapper在POCO和JSON字段之间创建映射?

public class SomeObjectEntity
{
    //JSON
    public string TaskData { get; set; }
    public GUID Id { get; set; }
    public DateTime CreateTime { get; set; }
}

public class SomeObjectModel
{
    public string Name { get; set; }
    public string[] Emails { get; set; }
    public GUID Id { get; set; }
    public DateTime CreateTime { get; set; }
}

在TaskData中我有这个JSON字符串:

@"
{
    ""Name"": ""Denis"",
    ""EMails"": [
        ""someemail1@email.com"",
        ""someemail2@email.com""
    ]
}"

有没有办法创建地图?

protected override void Configure()
{
    Mapper.CreateMap<SomeObjectEntity, SomeObjectModel>() ...

    Mapper.CreateMap<SomeObjectModel, SomeObjectEntity>() ...
}

感谢。

2 个答案:

答案 0 :(得分:4)

从上面的代码中,我看到您要转换Name类中的Emails + SomeObjectModel属性并将其转换为JSON字符串并将其映射到{{1字符串属性。这可以使用自定义AutoMapper ValueResolver来完成。

SomeObjectEntity.TaskData

然后调用您的映射器代码:

public class NameAndEmailResolver : ValueResolver<SomeObjectModel, string>
{
    protected override string ResolveCore(SomeObjectModel source)
    {
        // need a quick and dirty list so we can perform linq query to isolate properties and return an anonymous type
        var list = new List<SomeObjectModel>(){source};
        return JsonConvert.SerializeObject(list.Select(x => new{x.Name, x.Emails});
    }
}

这仅适用于单向绑定。你必须编写代码以反向:SomeObjectModel - &gt; SomeObjectEntity。

答案 1 :(得分:-1)

正如Jeroen所提到的,您需要首先将json字符串反序列化为其对应的类型。为此,您可以使用以下内容。假设您对应于json的类型为T,则以下内容将对其进行反序列化,并为您提供一个可用于映射的对象。

private async Task<T> ParseJsonToObjectAsync(string jsonValue)
{
    var obj = await Task.Factory.StartNew(()=>JsonConvert.DeserializeObject<T>(jsonValue);
    return obj;
}

您还可以使用http://json2csharp.com/来帮助您生成与json字符串对应的类型。它会节省你的时间。 如果描述中的SomeObjectEntity或TaskData是json字符串的对象表示,那么这就是T。

将json反序列化后,您可以手动映射或使用https://github.com/AutoMapper/AutoMapper