7
votes

Automapper: convertir JSON à la liste des objets

Objet source (JSON, à l'aide de JSON.NET si cela compte):

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<JObject, CorporateRatesInfo>();
    cfg.AddProfile<CorporateRatesProfile>();
});

//config.AssertConfigurationIsValid();
_mapper = config.CreateMapper();


public class CorporateRatesProfile : Profile
{
    protected override void Configure()
    {
        CreateMap<JObject, CorporateRatesInfo>()
            .ForMember("SaaCodes", cfg => { cfg.MapFrom(jo => jo["sAA"]); })
            .ForMember("Conum", cfg => { cfg.MapFrom(jo => jo["conum"]); })
            .ForMember("Name", cfg => { cfg.MapFrom(jo => jo["name"]); })
            .ForMember("AgencyName", cfg => { cfg.MapFrom(jo => jo["agencyName"]); });
    }
}


1 commentaires

Vous devez également vous rendre dans la cartographe de Jobject à Saacode.


3 Réponses :


7
votes

Essayez ceci -

public class CorporateRatesInfo
{
    public string Conum { get; set; }
    public string Name { get; set; }
    public string AgencyName { get; set; }
    public List<SaaCode> SaaCodes { get; set; }
}

public class SaaCode
{
    public string Code { get; set; }
    public string Description { get; set; }
}

public class CorporateRatesProfile : Profile
{
    protected override void Configure()
    {
        CreateMap<JObject, SaaCode>()
            .ForMember("Code", cfg => { cfg.MapFrom(jo => jo["code"]); })
            .ForMember("Description", cfg => { cfg.MapFrom(jo => jo["description"]); });

        CreateMap<JObject, CorporateRatesInfo>()
            .ForMember("SaaCodes", cfg => { cfg.MapFrom(jo => jo["sAA"]); })
            .ForMember("Conum", cfg => { cfg.MapFrom(jo => jo["conum"]); })
            .ForMember("Name", cfg => { cfg.MapFrom(jo => jo["name"]); })
            .ForMember("AgencyName", cfg => { cfg.MapFrom(jo => jo["agencyName"]); });


    }
}

class Program
{
    static void Main(string[] args)
    {

        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<JObject, CorporateRatesInfo>();
            cfg.AddProfile<CorporateRatesProfile>();
        });

        //config.AssertConfigurationIsValid();
        var mapper = config.CreateMapper();

        var jsonText =  @"
                            {
                                ""conum"" : 1001,
                                ""name"" : ""CLN Industries Corporation"",
                                ""agencyName"" : ""Murphy, Holmes & Associates, LLC"",
                                ""sAA"" : [{
                                        ""code"" : 247,
                                        ""description"" : ""Mechanic\u0027s lien - Bond to Discharge - Fixed penalty - where principal has posted Performance and Pa""
                                    }, {
                                        ""code"" : 277,
                                        ""description"" : ""Mechanic\u0027s lien - Bond to Discharge - Open Penalty - where principal has posted Performance and Paym""
                                    }, {
                                        ""code"" : 505,
                                        ""description"" : ""Indemnity Bonds - Contractor\u0027s Indemnity Against Damages where there is a performance bond and addit""
                                    }
                                ]
                            }
                        ";

        var jsonoObj = JObject.Parse(jsonText);

        CorporateRatesInfo dto = mapper.Map<CorporateRatesInfo>(jsonoObj);



    }
}


3 commentaires

Fantastique! J'ai essayé de semblable, mais je pensais que le type source allait être une chaîne. :(


La mise en œuvre des corporatésProfile ne fonctionne que vers la version 4.x. Après 5.0, c'est obsolète et vous devez utiliser cette approche (et plus propre IMHO) automapper.readthedocs.io/fr/Latest/.../a>


Saacodes est vide, il ne correspond pas.



0
votes

Malheureusement, j'ai suivi QUESTION DE BANDAMAMP dans les versions plus récentes de FADApper et a eu du mal à obtenir ce travail.

Mon alternative approche pour quiconque trouver ce problème a été trouvé sur le Source

Exemple de tableau xxx

}

Exemple de profil de configuration du profil xxx

tycleConverter xxx


0 commentaires

3
votes

Rapport, j'ai écrit une solution simple si les noms de champs correspondant, vous pouvez utiliser le désériorizer de Newtonsoft à l'intérieur de la méthode d'assistance de l'extension Maper. J'ai écrit une méthode d'extension générique Resoldjson.

CreateMap<JObject, CorporateRatesInfo>()
    .ForMember(x => x.SaaCodes,m => { m.MapFrom(s => s.ResolveJson<SaaCode>("sAA"));});


0 commentaires