2017-06-13 76 views
0

在我的场景中,我想将json映射到具体类型,另一种方式是使用带有.net核心的automapper版本6。Automapper:将对象转换为JSON

基于这个答案 - https://stackoverflow.com/a/38108128/6602770我设法将JSON映射到所需的类型。但是,我似乎无法将其映射回其JSON格式。

我的代码如下所示:

映射轮廓:

CreateMap<JToken, SomeDto>() 
      .ForMember(dest => dest.ObjectId, cfg => { cfg.MapFrom(jo => jo["objectId"]); }) 
      .ReverseMap() 
      .ForAllOtherMembers(x => x.Ignore()); 

和映射:

var json = _mapper.Map<JToken>(someDto); 

没有错误,但它返回null。 我也尝试用JObject而不是JToken来设置配置文件,结果相同。

我还试图创建一个单独的映射分布,而是采用了“ReverseMap”

public class SomeDtoProfile : Profile 
{ 
    public SomeDtoProfile() 
    { 
     CreateMap<SomeDto, JObject>() 
      .ForMember(dest=> dest["objectId"], cfg => { cfg.MapFrom(src => src.ObjectId); }) 
      .ForAllOtherMembers(x => x.Ignore()); 

    } 
} 

但是,这将引发一个错误信息:“为成员自定义配置仅支持顶级个人会员上一个类型的json“

我真的很喜欢使用AutoMapper的解决方案,是所有可能的还是我缺少一些基本的东西?

+1

为什么要为此使用automapper?为什么不直接将你的JSON转换为'SomeDto'?如果序列化/反序列化变得复杂,则可以使用自定义转换器。 –

+0

为什么你不使用[Json.NET](https://www.nuget.org/packages/newtonsoft.json)来序列化或反序列化? – Behzad

+0

我已经使用automapper的第一种方式(JSON到SomeDto),它涉及到许多属性和自定义的解析器。我想保留使用相同概念的其他方式的映射逻辑。可以做到吗? – Egor

回答

0

在Mapper配置文件中使用JObject.FromObject静态工厂方法。

public class SomeDtoProfile : Profile 
{ 
    public SomeDtoProfile() 
    { 
     CreateMap<SomeDto, JObject>() 
      .ConvertUsing(JObject.FromObject); 
    } 
} 

public class SomeDto  
{ 
    public string Name { get; set; } 
} 

那么,如果我们运行下面的测试

public class Tests 
{ 
    [Fact] 
    public void ShouldReturnJson() 
    { 
     Mapper.Initialize(cfg => cfg.AddProfile(new SomeDtoProfile())); 


     var jObject = Mapper.Map<JObject>(new SomeDto {Name = "Bob"}); 

     Assert.Equal("{\r\n \"Name\": \"Bob\"\r\n}", jObject.ToString()); 
    } 
} 

全部是绿色的!

+0

但是,这个方法正在工作,我如何指定映射属性名称?和它的自定义解析器?说我想将“名称”映射到“objectName”? – Egor

+0

您需要使用'json.net'功能来指定它们,在这种情况下,更改字段名称意味着添加属性'[JsonProperty(PropertyName =“objectName”)]' –

+0

感谢您以正确的方式指引我!我设法用“ConstructUsing”方法实现它,如下所示:'CreateMap ().ConstructUsing(src => {return JObject.FromObject(new {objectId = src.ObjectId,// ... ...映射...});}).ForAllOtherMembers(x => x.Ignore());' – Egor