2017-06-13 10 views
0

私のシナリオでは、jsonを具体的な型にマッピングしたいと思います。また、automapperバージョン6を.netコアで使用する方法もあります。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を返し

私のコードは次のようになります。 JTokenの代わりにJObjectを使用してプロファイルを設定しようとしましたが、同じ結果が得られました。

私はまた、別々のマッピングプロファイルを作成しようとした代わりに「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

なぜオートマッパを使うのですか?あなたのJSONを 'SomeDto'に直接変換してみませんか?シリアライズ/デシリアライズが複雑になる場合は、カスタムコンバータを使用できます。 –

+0

[Json.NET](https://www.nuget.org/packages/newtonsoft.json)をシリアル化またはデシリアライズしないのはなぜですか? – Behzad

+0

私は既に第1の方法(JSONからSomeDtoへ)のためにautomapperを使用していますが、多くのプロパティとカスタムリゾルバが関係しています。私は、同じ考え方を使って、他の方法でマッピングロジックを維持したいと思います。それはできますか? – Egor

答えて

0

Mapperプロファイル内のJObject.FromObject静的ファクトリメソッドを使用します。我々は、次の試験

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()); 
    } 
} 

を実行する場合

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

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

は、すべてがグリーンです!

+0

このメソッドは動作していますが、どのようにマッピングプロパティ名を指定できますか?それとカスタムリゾルバ? "name"を "objectName"にマップしたいとしますか? – Egor

+0

'json.net'機能を使って指定する必要があります。この場合、フィールド名を変更すると' [JsonProperty(PropertyName = "objectName")] '属性を追加することになります。 –

+0

私に正しい方法で指摘してくれてありがとう! "CreateMap ().ConstructUsing(src => {return JObject.FromObject(new {objectId = src.ObjectId、// ...残りの部分は次のようにして作成しました。マッピング...});}).ForAllOtherMembers(x => x.Ignore()); ' – Egor

関連する問題