是否可以使用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>() ...
}
感谢。
答案 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