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

C# 自动映射:将对象转换为JSON,c#,json,automapper,C#,Json,Automapper,在我的场景中,我想将json映射到一个具体的类型,另一种方法是使用AutomapperVersion6和.NETCore 基于这个答案-我设法将JSON映射到所需的类型。然而,我似乎无法将其反向映射回JSON格式 我的代码如下所示: 映射配置文件: CreateMap<JToken, SomeDto>() .ForMember(dest => dest.ObjectId, cfg => { cfg.MapFrom(jo => jo["obj

在我的场景中,我想将json映射到一个具体的类型,另一种方法是使用AutomapperVersion6和.NETCore

基于这个答案-我设法将JSON映射到所需的类型。然而,我似乎无法将其反向映射回JSON格式

我的代码如下所示:

映射配置文件:

 CreateMap<JToken, SomeDto>()
            .ForMember(dest => dest.ObjectId, cfg => { cfg.MapFrom(jo => jo["objectId"]); })
            .ReverseMap()
            .ForAllOtherMembers(x => x.Ignore());
CreateMap()
.ForMember(dest=>dest.ObjectId,cfg=>{cfg.MapFrom(jo=>jo[“ObjectId]”);})
.ReverseMap()
.ForAllOtherMembers(x=>x.Ignore());
以及映射:

var json = _mapper.Map<JToken>(someDto);
var json=\u mapper.Map(someDto);
没有错误,但返回null。 我还尝试用JObject而不是JToken设置概要文件,结果相同

我还尝试创建一个单独的映射配置文件,而不是使用“ReverseMap”

public类SomeDtoProfile:Profile
{
公共SomeDtoProfile()
{
CreateMap()
.ForMember(dest=>dest[“objectId”],cfg=>{cfg.MapFrom(src=>src.objectId);})
.ForAllOtherMembers(x=>x.Ignore());
}
}
但这会抛出一个错误:“成员的自定义配置仅支持json类型上的顶级单个成员”


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

在映射器配置文件中使用
JObject.FromObject
静态工厂方法

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

public class SomeDto    
{
    public string Name { get; set; }
}
public类SomeDtoProfile:Profile
{
公共SomeDtoProfile()
{
CreateMap()
.ConvertUsing(JObject.FromObject);
}
}
公共课
{
公共字符串名称{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());
    }
}
公共类测试
{
[事实]
public void ShouldReturnJson()
{
初始化(cfg=>cfg.AddProfile(newsomedtoprofile());
var jObject=Mapper.Map(newsomedto{Name=“Bob”});
Assert.Equal(“{\r\n\“Name\”:\“Bob\”\r\n}”,jObject.ToString());
}
}

一切都是绿色的

为什么要用automapper呢?为什么不直接将JSON转换为
SomeDto
?如果序列化/反序列化变得复杂,可以使用自定义转换器。为什么不使用来序列化或反序列化?我已经在第1种方式中使用automapper(JSON到SomeDto),它涉及许多属性和自定义解析程序。我希望使用相同的概念以另一种方式保留映射逻辑。可以吗?此方法正在工作,但是,如何指定映射属性名称?和它的自定义解析器?假设我想将“Name”映射到“objectName”?您需要使用
json.net
功能来指定它们,在这种情况下,更改字段名意味着添加属性
[JsonProperty(PropertyName=“objectName”)]
谢谢您给我指出了正确的方法!我设法用“ConstructUsing”方法完成了它,如下所示:
CreateMap().ConstructUsing(src=>{return JObject.FromObject(new{objectId=src.objectId,/…其余的映射…});})
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());
    }
}