2017-08-16 5 views
0

Je cherche la meilleure approche pour ce scénario:deserialize différents documents JSON à la même structure d'objet

J'aimerais créer WebAPI qui renvoie au client un objet comme:

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

je peux récupérer ces données provenant de différents fournisseurs de données (document de SRD) qui peuvent avoir différentes structures de données comme:

Première source:

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

Deuxième source:

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

Troisième source:

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

Quelle sera la meilleure approche pour le rendre facile d'étendre avec les fournisseurs de données à venir? Je voudrais ajouter que je pensais à la librairie JSON.NET comme toujours. Donc, je crois que je cherche des exemples de différents mappings json dépendent des fournisseurs de données? N'importe qui peut aider avec un exemple? Permettez-moi d'ajouter aussi que c'est juste un scénario 'en lecture seule', donc je veux dire que WebApi appelle différents dbs => désérialiser en un objet => finalement manipule sur l'objet lui-même => envoyer sur http.

+0

Je voudrais simplement utiliser une cartographie du résultat de chaque fournisseur à votre propre cartographie réutilisable, même si les données semblent similaires. Tout ce que vous allez essayer de faire générique est lié à la rupture au prochain nouveau fournisseur. – oerkelens

+0

La meilleure chose à faire serait que l'OMI utilise [AutoMapper] (http://automapper.org/) –

Répondre

0

Automapper et trois dtos différents seraient la façon la plus correcte. Mais si vous voulez le faire d'une manière très simple, vous pouvez simplement créer une seule classe avec toutes les différentes propriétés et ont des propriétés correspondant utilisent la même variable de support

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

Vous pouvez utiliser AutoMapper pour résoudre ce problème.

http://automapper.org/

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

Essayez l'exemple ci-dessous

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

Donc, je voudrais éviter de définir ces entités 'SourceX'. et au lieu de cela désérialiser directement de documentdb à ReturnObject –