2017-07-19 2 views
0

Ich habe ein Problem, wenn ich versuche, eine Liste von Objekten zu deserialisieren. Alle Eigenschaften im Objekt werden außer für die Eigenschaften, die von meiner Basisklasse "BusinessObjectBaseId" übernommen werden, deserialisiert. Warum sollte die Eigenschaft "Id" nicht deserialisiert werden? (In der folgenden ist mein Code/Workflow)C# - Deserialisierung der Objektliste, deserialisiert die geerbten Eigenschaften nicht

Basis:

public abstract class BusinessObjectBaseId : BusinessObjectBase 
{ 
    [DataMember] 
    public virtual Guid Id { get; set; } 
} 

Objekt:

public class NameAssociation : BusinessObjectBaseId 
{ 
    [DataMember] 
    public string Name { get; set; } 
} 

Json Objekt:

[{"Name":"Joe","Id":"10eea25b-16aa-42d6-950a-4c28cb0537f4"},{"Name":"Fred","Id":"a913f4b4-1c82-4d19-ade8-949227ac7d08"}] 

Ich nenne:

List<NameAssociation> list = JsonConvert.DeserializeObject<List<NameAssociation>>(jsonData); 

ich zurück:

[0] : Name: Joe, Id: 00000000-0000-0000-0000-000000000000 
[1] : Name: Fred, Id: 00000000-0000-0000-0000-000000000000 
+1

es könnte sein, weil in der JSON-Id eine Zeichenfolge ist, in Ihrem DTO ist es eine GUID, versuchen Sie es in Zeichenfolge ändern und sehen, ob es funktioniert. Im Idealfall möchten Sie, dass die dtos mit dem JSON 100% übereinstimmen, und dann würden Sie die DtOs Domänenobjekten zuordnen. – JOSEFtw

Antwort

2

Sie das [DataContract] Attribut aus der Basisklasse omittted haben. Dieser Code reproduziert das Problem:

namespace StackOverflow45198156 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string json = "[{\"Name\":\"Joe\",\"Id\":\"10eea25b-16aa-42d6-950a-4c28cb0537f4\"},{\"Name\":\"Fred\",\"Id\":\"a913f4b4-1c82-4d19-ade8-949227ac7d08\"}]"; 

      var list = JsonConvert.DeserializeObject<List<NameAssociation>>(json); 
     } 
    } 

    public abstract class BusinessObjectBaseId 
    { 
     [DataMember] 
     public Guid Id { get; set; }  
    } 

    [DataContract] 
    public class NameAssociation : BusinessObjectBaseId 
    { 
     [DataMember] 
     public string Name { get; set; } 
    } 
} 

Und das behebt es:

[DataContract] 
public abstract class BusinessObjectBaseId 
{ 
    [DataMember] 
    public Guid Id { get; set; } 
} 

oder weglassen alle [DataContract] und [DataMember] Attribute zusammen.

Verwandte Themen