2012-04-12 20 views
2

Ich verwende json.net, um meine Json-Deserialisierung in einem von IIS gehosteten Restful-Dienst durchzuführen.Json.net kann eine Liste komplexer Typen nicht deserialisieren

Zuerst, hier sind die Objekte, mit denen ich versuche zu arbeiten.

[DataContract] 
public class CreateSamplesRequest 
{ 
    [DataMember] public Guid SessionId { get; set; } 
    [DataMember] public SampleTemplateDTO Template { get; set; } 
} 
[DataContract] 
public class SampleTemplateDTO 
{ 
    [DataMember] public int NumberOfSamples { get; set; } 
    [DataMember] public int CompanyId { get; set; } 
    [DataMember] public int SampleTypeId { get; set; } 
    [DataMember] public HmisDTO Hmis { get; set; } 
    [DataMember] public List<AttributeValueDTO> AttributeValues { get; set; } 
} 
[DataContract] 
public class AttributeValueDTO 
{ 
    [DataMember] public int AttributeId { get; set; } 
    [DataMember] public string AttributeName { get; set; } 
    [DataMember] public string Value { get; set; } 
} 

[DataContract] 
public class HmisDTO 
{ 
    [DataMember] public string Health { get; set; } 
    [DataMember] public string Flammability { get; set; } 
    [DataMember] public string Reactivity { get; set; } 
    [DataMember] public string Equipment { get; set; } 
} 

Die Hilfeseite fragt nach json in diesem Format für die CreateSamplesRequest

{ 
"SessionId":"1627aea5-8e0a-4371-9022-9b504344e724", 
"Template":{ 
    "NumberOfSamples":2147483647, 
    "CompanyId":2147483647, 
    "SampleTypeId":2147483647, 
    "Hmis":{ 
     "Health":"String content", 
     "Flammability":"String content", 
     "Reactivity":"String content", 
     "Equipment":"String content" 
    }, 
    "AttributeValues":[{ 
     "AttributeId":2147483647, 
     "AttributeName":"String content", 
     "Value":"String content" 
    }] 
    } 
} 

Und das ist, was ich schicke tatsächlich:

{ 
"SessionId":"17aaec11-be28-4536-b5df-d98fbda91e91", 
"Template":{ 
    "NumberOfSamples":1, 
    "CompanyId":1, 
    "SampleTypeId":9, 
    "Hmis":{ 
     "Health":"2", 
     "Flammability":"0", 
     "Reactivity":"0", 
     "Equipment":"E", 
    }, 
    "AttributeValues":[ 
     {"AttributeId":1,"AttributeName":"Item No.","Value":"MN0002NG"}, 
     {"AttributeId":2,"AttributeName":"Lot No.","Value":"C4526"} 
    ] 
} 
} 

Das Problem, das ich habe, ist, dass die AttributeValues-Eigenschaft des SampleTemplateDTO-Objekts immer ignoriert wird. Mit dem obigen Code wird es null sein. Wenn ich es auf eine leere List<AttributeValueDTO> installiere, wird es eine leere Liste sein. Ich habe mir schon seit ein paar Stunden den Kopf dagegen geschlagen.

Ich habe versucht, einen Dienst zu erstellen, der nur eine List<AttributeValueDTO> dauert und es funktioniert gut. Ich habe versucht, eine Wrapper-Klasse für die AttributeValues ​​zu erstellen und es endet immer noch als null. Ich bin völlig ratlos. Irgendwelche Ideen?

Antwort

6

MUTTER GOTTES, ICH VERBRAUCHTE NUR 5 FREAKING STUNDEN AUF EINEM FREAKOMMA. Das nachgestellte Komma in der HMIS-Sektion war offenbar dazu zu sagen, dass json.net an diesem Punkt aufhören sollte zu analysieren.

Als ich diesen json einreichen:

{ 
"SessionId":"17aaec11-be28-4536-b5df-d98fbda91e91", 
"Template":{ 
    "NumberOfSamples":1, 
    "CompanyId":1, 
    "SampleTypeId":9, 
    "Hmis":{ 
    "Health":"2", 
    "Flammability":"0", 
    "Reactivity":"0", 
    "Equipment":"E" 
    },  
    "AttributeValues":[ 
    {"AttributeId":1,"AttributeName":"Item No.","Value":"MN0002NG"}, 
    {"AttributeId":2,"AttributeName":"Lot No.","Value":"C4526"} 
    ]  
} 
} 

Alles funktioniert super.

Verwandte Themen