2013-07-10 12 views
6

Mam następujący JSON wraca ze zdalnego interfejsu API (nie mogę zmodyfikować JSON zwrócony)JSON.Net Konwersja wewnętrzną obiektu w C# Modelu

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

Teraz używając Json.NET przekonwertować to do modelu Muszę stworzyć 2 modele.

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

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

i zrobić coś takiego ..

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

i działa to dobrze - mój problem pojawia się, gdy mam około 50 połączeń, aby do API i naprawdę nie fantazyjne tworząc drugą „kontener” dla każdy. Czy istnieje sposób na zwrócenie powyższego przykładu bezpośrednio do TicketModel?

+0

Jeśli trzeba deserialise między każdego wywołania API wtedy naprawdę nie ma sposobu wokół tego. Po zwróceniu 50 zgłoszeń interfejsu API można przeprowadzić deserializację. –

+0

Hi @SamLeach Mam 50 różnych wywołań API, więc nie jest to ilość połączeń, ale po prostu ból w tworzeniu modeli kontenerów, które po prostu nie są użyteczne dla niczego oprócz Deserializacji! – LiamB

Odpowiedz

1

Można zrobić to w ten sposób:

 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

Modyfikacja JSON tak wygląda to

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

i zrobić

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

lub nawet

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

więc nie trzeba żadnych modeli.

+0

Witam Sam, nie mogę zmodyfikować JSON, ponieważ jest to zewnętrzny interfejs API. - Zaktualizowane pytanie do wyjaśnienia. – LiamB

+0

Dlaczego nie? Jeśli zwróci Json, możesz zrobić z nim, co chcesz. –

1

użycie Newtonsoft's JArray do dostosować ur json przed deserializowania

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; 
    } 
Powiązane problemy