2016-10-11 2 views
1

ich einen Web-Service, die JSON in FormDeserialising json Zeichenfolge zur Liste <T>

{"AppointmentList":[{"AppointmentList":{"id":"1","MeetingId":"1","MeetingName":"Test Meeting 1","Length":"90","Room":"B2C","DateTimeFrom":"1st Sept 2016","Venue":"The old pub","DateCreated":"2016-08-30 00:00:00","DateDue":"2016-09-01 00:00:00","UserId":"JohnsonPa"}},{"AppointmentList":{"id":"2","MeetingId":"2","MeetingName":"Test Meeting 2","Length":"60","Room":"B2C","DateTimeFrom":"11th Sept 2016","Venue":"The old pub","DateCreated":"2016-09-01 00:00:00","DateDue":"2016-09-12 00:00:00","UserId":"JohnsonPa"}...}]} 

ich ausgibt bin versucht, diese in deserialise zur Liste. Normalerweise hätte ich eine Basisklasse, die eine Eigenschaft List AppointmentList {get; set;}, das würde jedoch bedeuten, dass ich den Typ T nicht verwenden kann und für jede Klasse einen Stapel doppelten Codes benötige.

Ich kann sicherlich BaseClass mit einer Eigenschaft public List Data {get; set;}, da JSON nicht zu Data dekodiert (falscher Name) und JSON PropertyName nicht auf den von typeof (T) .ToString() abgeleiteten Klassennamen gesetzt werden kann.

Gibt es eine Möglichkeit zu erreichen, was ich ohne viel Code-Duplikation tun möchte?

Ich habe versucht, den Deserialiser zu JArray zu werfen und einen Reader daraus zu erstellen, aber dies löst eine Ausnahme aus.

+0

Nicht sicher, warum Sie mit einer konkreten Klasse für dieses Objekt verhindern Generika verwenden? Und wirklich, es wäre am besten, ein View-Modell zu erstellen, das dem Objekt für das Deserialzing entspricht. – Darren

+0

Warum sollte ich ein View-Modell dafür haben - es sind reine Daten, so dass es innerhalb eines Modells gehandhabt werden kann. – Nodoid

+0

Nur Terminologie - nennen Sie es ein DTO, wenn Sie bevorzugen. Punkt zu sein, um es zu deserialisieren, ist es vielleicht besser zu sagen, welchen Mechanismus Sie verwenden, welcher Typ zu deserialisieren ist. Vor allem, wenn Sie dieses Objekt herumreichen. Noch immer nicht beantwortet, warum dies Auswirkungen auf die Verwendung von Generika – Darren

Antwort

1

Ich bin nicht sicher, ob dies genau das ist, was Sie brauchen, aber vielleicht würde so etwas funktionieren? Es ermöglicht Ihnen, erfolgreich zu einem JArray zu deserialisieren, wie Sie sagen, dass Sie am Ende Ihrer Frage versucht haben.

JArray result = JsonConvert.DeserializeObject<dynamic>(json).AppointmentList; 
0

Hier ist, wie es zu konvertieren List<object>

dynamic data = JsonConvert.DeserializeObject(json); 
JArray array = data.AppointmentList; 

List<object> objectList = array.ToObject<List<object>>(); 
+0

Danke. Das einzige Problem ist, dass ich T übergebe, was die Klasse ist, daher wird data.T nichts geben. – Nodoid

+0

@Nodoid Wenn ich Sie verstehe, schreiben Sie den Klassennamen anstelle von Objekt. Oder Sie haben dieses JSON in einer generischen Klasse und möchten die Liste von dieser generischen Methode zurückgeben. In diesem Fall, wenn das T: -Objekt, sollte es kein Problem sein, Liste schreiben? – mybirthname

0

Was mit Generika ist falsch? Wenn Sie eine schemalose Datenstruktur verwenden möchten, verwenden Sie JObject oder dynamic, falls nicht, können Sie dies versuchen.

class Program 
    { 
     public const string json = @"{""AppointmentList"":[{""AppointmentList"":{""id"":""1"",""MeetingId"":""1"",""MeetingName"":""Test Meeting 1"",""Length"":""90"",""Room"":""B2C"",""DateTimeFrom"":""1st Sept 2016"",""Venue"":""The old pub"",""DateCreated"":""2016-08-30 00:00:00"",""DateDue"":""2016-09-01 00:00:00"",""UserId"":""JohnsonPa""}},{""AppointmentList"":{""id"":""2"",""MeetingId"":""2"",""MeetingName"":""Test Meeting 2"",""Length"":""60"",""Room"":""B2C"",""DateTimeFrom"":""11th Sept 2016"",""Venue"":""The old pub"",""DateCreated"":""2016-09-01 00:00:00"",""DateDue"":""2016-09-12 00:00:00"",""UserId"":""JohnsonPa""}}]}"; 

     static void Main(string[] args) 
     { 
      var items = Newtonsoft.Json.JsonConvert.DeserializeObject<AppointmentItemList<Meeting1>>(json).GetList(); 

      var items2 = Newtonsoft.Json.JsonConvert.DeserializeObject<AppointmentItemList<Meeting2>>(json).GetList(); 

      Console.ReadLine(); 
     } 

     public class AppointmentItemList<T> 
     { 
      public List<AppointmentItem> AppointmentList { get; set; } 

      public class AppointmentItem 
      { 
       public T AppointmentList { get; set; } 
      } 

      public IList<T> GetList() 
      { 
       return AppointmentList.Select(al => al.AppointmentList).ToList(); 
      } 
     } 

     public class Meeting1 
     { 
      [Newtonsoft.Json.JsonProperty("id")] 
      public string Id { get; set; } 

      public string MeetingName { get; set; } 
     } 

     public class Meeting2 
     { 
      [Newtonsoft.Json.JsonProperty("id")] 
      public string Id { get; set; } 

      public string Room { get; set; } 
     } 
    } 
Verwandte Themen