2016-05-24 5 views
1

Hallo alles, ich versuche, ein JSON mit Newtonsoft Json in C# Klassen zu analysieren. Die JSON ich versuche zu analysieren, wie folgt-Nicht in der Lage, JSON in einer UWP-App zu deserialisieren

[ 
    { 
    "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", 
    "id": "bakerloo", 
    "name": "Bakerloo", 
    "modeName": "tube", 
    "disruptions": [ ], 
    "created": "2016-05-10T15:41:47.997", 
    "modified": "2016-05-10T15:41:47.997", 
    "lineStatuses": [ 
     { 
     "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", 
     "id": 0, 
     "statusSeverity": 10, 
     "statusSeverityDescription": "Good Service", 
     "created": "0001-01-01T00:00:00", 
     "validityPeriods": [ ] 
     } 
    ], 
    "routeSections": [ ], 
    "serviceTypes": [ 
     { 
     "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", 
     "name": "Regular", 
     "uri": "/Line/Route?ids=Bakerloo&serviceTypes=Regular" 
     } 
    ] 
    }, 
    { 
    "$type": "Tfl.Api.Presentation.Entities.Line, Tfl.Api.Presentation.Entities", 
    "id": "central", 
    "name": "Central", 
    "modeName": "tube", 
    "disruptions": [ ], 
    "created": "2016-05-10T15:41:48.45", 
    "modified": "2016-05-10T15:41:48.45", 
    "lineStatuses": [ 
     { 
     "$type": "Tfl.Api.Presentation.Entities.LineStatus, Tfl.Api.Presentation.Entities", 
     "id": 0, 
     "statusSeverity": 10, 
     "statusSeverityDescription": "Good Service", 
     "created": "0001-01-01T00:00:00", 
     "validityPeriods": [ ] 
     } 
    ], 
    "routeSections": [ ], 
    "serviceTypes": [ 
     { 
     "$type": "Tfl.Api.Presentation.Entities.LineServiceTypeInfo, Tfl.Api.Presentation.Entities", 
     "name": "Regular", 
     "uri": "/Line/Route?ids=Central&serviceTypes=Regular" 
     } 
    ] 
    } 
] 

Die JSON über diesen folgenden Code abgerufen wird block-

public static async Task<List<TubeAPI>> GetTubeStatusAsync() 
{ 
string url = 
String.Format("https://api.tfl.gov.uk/Line/central,victoria/Status/detail=true&app_id=&app_key="); 
HttpClient http = new HttpClient(); 
      var response = await http.GetAsync(url); 
      var jsonMessage = await response.Content.ReadAsStringAsync(); 
var result = JsonConvert.DeserializeObject<List<TubeAPI>>(jsonMessage); 
return result; 
} 

Die Klassen Ich versuche, in de serialisiert sind als folgt-

public class TubeAPI 
    { 
     public RootArray[] Property1 { get; set; } 
    } 

    public class RootArray 
    { 
     public string type { get; set; } 
     public string id { get; set; } 
     public string name { get; set; } 
     public string modeName { get; set; } 
     public object[] disruptions { get; set; } 
     public DateTime created { get; set; } 
     public DateTime modified { get; set; } 
     public Linestatus[] lineStatuses { get; set; } 
     public object[] routeSections { get; set; } 
     public Servicetype[] serviceTypes { get; set; } 
    } 

    public class Linestatus 
    { 
     public string type { get; set; } 
     public int id { get; set; } 
     public int statusSeverity { get; set; } 
     public string statusSeverityDescription { get; set; } 
     public DateTime created { get; set; } 
     public object[] validityPeriods { get; set; } 
    } 

    public class Servicetype 
    { 
     public string type { get; set; } 
     public string name { get; set; } 
     public string uri { get; set; } 
    } 

ich habe den Debugger bei var result zu debuggen gesetzt und sehen, ob die Analyse durchgeht, und ich habe Daten in den Klassen. Aber die Klassen sind nicht bevölkert! enter image description here

Wie Sie sehen können, ist das Feld Property1 null. Ich bin verwirrt, was mache ich hier falsch?

+0

@ Mason arbeitete! post als Antwort bitte. Auch warum es jetzt funktioniert? Ich dachte, wir müssen auf die Rootobject-Klasse verweisen (wie im obersten Feld und in meinem Fall scheint es 'Property1' zu sein) – envyM6

Antwort

1

Sie deserialisieren als List<TubeAPI>. Sie sollten stattdessen als List<RootArray> deserialisieren, denn das ist die Struktur, die Ihrem JSON entspricht. Sie haben ein Array von RootArray, kein Array von TubeAPI. Wenn Sie den gesamten JSON in Anführungszeichen einschließen, haben Sie eine Singular TubeAPI.

var result = JsonConvert.DeserializeObject<List<RootArray>>(jsonMessage);