2013-07-10 8 views
6

Ich habe folgenden JSON zurück von einem Remote-API kommen (ich kann nicht ändern, die JSON zurück)JSON.Net konvertieren inneres Objekt in C# Modell

{ 
    "APITicket": { 
     "location": "SOMEVALUE", 
     "ticket": "SOMEVALUE" 
    } 
} 

Jetzt JSON.Net mit dazu zu einem Modell konvertieren Ich muss 2 Modelle erstellen.

public class TicketModel 
    { 
     public string location { get; set; } 
     public string ticket { get; set; } 
    } 

    public class TicketContainer 
    { 
     public TicketModel APITicket { get; set; } 
    } 

und tun so etwas wie ..

var myObject = JsonConvert.DeserializeObject<TicketContainer>(this.JSONResponse); 

und das funktioniert gut - mein Problem entsteht, wenn ich um die 50 Anrufe an die API zu machen und nicht wirklich Lust auf einen zweiten ‚Container‘ zu schaffen für jeder. Gibt es eine Möglichkeit, das obige Beispiel direkt an das TicketModel zu binden?

+0

Wenn Sie zwischen jedem API-Aufruf deserialise in benötigen, dann gibt es wirklich keine Möglichkeit, darum herum. Nachdem die 50 API-Aufrufe zurückgegeben wurden, konnten Sie die Batch-Deserialisierung durchführen. –

+0

Hallo @SamLeach Ich habe 50 verschiedene API-Aufrufe, also ist es nicht eine Menge von Anrufen, sondern eher ein Problem beim Erstellen von Container-Modellen, die nur für das Deserialisieren nützlich sind! – LiamB

Antwort

1

Sie es auf diese Weise tun können:

 var json = @" 
        { 
         'APITicket': { 
          'location': 'SOMEVALUE', 
          'ticket': 'SOMEVALUE' 
         } 
        }"; 

     //Parse the JSON: 
     var jObject = JObject.Parse(json); 

     //Select the nested property (we expect only one): 
     var jProperty = (JProperty)jObject.Children().Single(); 

     //Deserialize it's value to a TicketModel instance: 
     var ticket = jProperty.Value.ToObject<TicketModel>(); 
1

die JSON ändern, so dass es wie dieses so

Dictionary<string, string> tickets = JsonConvert.DeserializeObject<Dictionary<string, string>>(this.JSONResponse); 

oder sogar

List<TicketModel> tickets = JsonConvert.DeserializeObject<List<TicketModel>>(this.JSONResponse); 

{ 
    "location": "SOMEVALUE", 
    "ticket": "SOMEVALUE" 
} 

und tun sieht man keine Modelle nicht brauchen.

+0

Hallo Sam, ich kann den JSON nicht ändern, da es eine externe API ist. - Aktualisierte Frage zur Klärung. – LiamB

+0

Warum nicht? Wenn es Json zurückgegeben wird, können Sie damit machen, was Sie wollen. –

1

Verwendung Newtonsoft's JArray zu ur json vor deserialize anpassen

public List<APITicket> JsonParser(string json) 
    { 
     Newtonsoft.Json.Linq.JArray jArray = Newtonsoft.Json.Linq.JArray.Parse(json); 

     var list = new List<APITicket>(); 

     foreach(var item in jArray) 
     { 
      list.Add(
       new APITicket { location = item["APITicket"]["location"], 
           ticket = item["APITicket"]["ticket"]    
       } 
      ); 
     } 
     return list; 
    } 
Verwandte Themen