自动映射:将对象转换为JSON

时间:2017-06-13 18:26:13

标签: c# json automapper

在我的场景中,我想将json映射到具体类型,另一种方法是使用带有.net核心的automapper版本6。

根据这个答案 - 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设置配置文件,结果相同。

我还试图创建一个单独的映射配置文件,而不是使用&#34; ReverseMap&#34;

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

    }
}

但是这会引发错误:&#34;成员的自定义配置仅支持json类型的顶级个人成员&#34;

我真的很喜欢使用AutoMapper的解决方案,这一切都是可能的还是我错过了一些基本的东西?

1 个答案:

答案 0 :(得分: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());
    }
}

一切都是绿色的!