2017-08-16 5 views
0

Ich bin für den besten Ansatz für einen solchen Szenario suchen:Deserialize verschiedene json Dokumente auf das gleiche Objekt Struktur

Ich mag würde WebAPI zu schaffen, die an den Client wie einige Objekt zurückgibt:

{ 
    id: 1, 
    name: "name1", 
    type: "type1" 
} 

kann ich solche Daten aus verschiedenen Datenanbietern (Dokument dbs) abrufen, die unterschiedliche Datenstrukturen wie haben:

Erste Quelle:

{ 
    id: 1, 
    name: "name1", 
    type: "type1" 
} 

Zweite Quelle:

{ 
    productId: 1, 
    productName: "product", 
    productType: "type" 
} 

dritte Quelle:

{ 
    itemId: 1, 
    itemName: "name", 
    itemType: "type" 
} 

Was wird der beste Ansatz sein, es zu leicht zu machen, mit dem nächsten Datenanbietern zu erweitern? Ich möchte hinzufügen, dass ich wie immer über JSON.NET-Bibliothek nachgedacht habe. Also ich glaube ich suche nach Beispielen für verschiedene JSON-Mappings, die von Datenanbietern abhängen? Jeder kann mit einem Beispiel helfen? Lassen Sie mich auch hinzufügen, dass es nur "schreibgeschützt" Szenario ist, so meine ich, dass WebApi verschiedene dbs => deserialize auf irgendein Objekt => manipuliert schließlich auf das Objekt selbst => send über http.

+0

ich einfach eine Abbildung von jedem Provider Ergebnis auf Ihr eigenes wiederverwendbares Mapping verwenden würde, auch wenn die Daten ähnlich aussehen. Alles Generische, das Sie versuchen werden, wird beim nächsten neuen Anbieter brechen. – oerkelens

+0

Am besten wäre es, IMO zu verwenden [AutoMapper] (http://automapper.org/) –

Antwort

0

Automapper und drei verschiedene dtos wäre der richtige Weg imo. Aber wenn Sie wollen, dass es eine wirklich einfache Art und Weise zu tun, könnten Sie nur eine einzige Klasse mit all den verschiedenen Eigenschaften erstellen und haben entsprechende Eigenschaften verwenden, um den gleichen Träger variable

class Item 
{ 
    string _id; 

    public string id 
    { 
     get 
     { 
      return _id; 
     } 
     set 
     { 
      _id = value; 
     } 
    } 
    public string productId 
    { 
     get 
     { 
      return _id; 
     } 
     set 
     { 
      _id = value; 
     } 
    } 
    public string itemId 
    { 
     get 
     { 
      return _id; 
     } 
     set 
     { 
      _id = value; 
     } 
    } 

    string _name; 

    public string name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name = value; 
     } 
    } 
    public string productName 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name = value; 
     } 
    } 
    public string itemName 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name = value; 
     } 
    } 

    string _type; 

    public string type 
    { 
     get 
     { 
      return _type; 
     } 
     set 
     { 
      _type = value; 
     } 
    } 
    public string productType 
    { 
     get 
     { 
      return _type; 
     } 
     set 
     { 
      _type = value; 
     } 
    } 
    public string itemType 
    { 
     get 
     { 
      return _type; 
     } 
     set 
     { 
      _type = value; 
     } 
    } 
} 
0

Sie können AutoMapper verwenden, um dieses Problem zu lösen.

http://automapper.org/

https://github.com/AutoMapper/AutoMapper/wiki/Getting-started

Versuchen Sie, die Probe unter

public class ReturnObject 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string Type { get; set; } 
    } 
    public class Source1 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string Type { get; set; } 
    } 
    public class Source2 
    { 
     public int ProductId { get; set; } 
     public string ProductName { get; set; } 
     public string ProductType { get; set; } 
    } 
    public class Source3 
    { 
     public int ItemId { get; set; } 
     public string ItemName { get; set; } 
     public string ItemType { get; set; } 
    } 

AutoMapper Profil

public class AutoMapperProfile : Profile 
{ 
    public AutoMapperProfile() 
    { 
     //Same properties 
     CreateMap<Source1, ReturnObject>(); 

     //Difference properties 
     CreateMap<Source2, ReturnObject>() 
      .ForMember(dest => dest.Id, opt => opt.MapFrom(f => f.ProductId)) 
      .ForMember(dest => dest.Name, opt => opt.MapFrom(f => f.ProductName)) 
      .ForMember(dest => dest.Type, opt => opt.MapFrom(f => f.ProductType)); 
     CreateMap<Source3, ReturnObject>() 
      .ForMember(dest => dest.Id, opt => opt.MapFrom(f => f.ItemId)) 
      .ForMember(dest => dest.Name, opt => opt.MapFrom(f => f.ItemName)) 
      .ForMember(dest => dest.Type, opt => opt.MapFrom(f => f.ItemType)); 
    } 
} 
+0

Also die Sache ist, dass ich gerne diese 'SourceX' Entitäten definieren würde. und stattdessen deserialize direkt von Documentdb zu ReturnObject –

Verwandte Themen