2017-06-13 73 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