2017-10-11 2 views
1

Ich arbeite an einer Anwendung mit xamarin.forms, wenn eine GET-Anforderung zum Anzeigen von CompanyName und CompanyLogo in der Ansicht die folgende Ausnahme auslöst: Ausnahme: System.InvalidCastException: Angegeben Besetzung ist nicht gültig. aufgetreten. Jede Hilfe, wie Sie dies beheben können, wird geschätzt. Vielen Dank. Unten ist mein Code. Json AntwortAngegebene Umwandlung ist in HttpClient-Anforderung nicht gültig

My:

{ 
    "Credentials": { 
     "Token": "K6Zi8VXfqWuthxgn3YEfrU6Bj/EKM7BqvSZcatFgvMx408yadbE+Qj6IuTnZ++C9q4Ty1W2f1quNYMKZxFBNZg==", 
     "Authenticated": true, 
     "SecretKey": null 
    }, 
    "Companies": [ 
     { 
      "CustomerID": 2, 
      "CompanyName": "Posworx", 
      "CompanyLogo": "\\admin.loyaltyworx.co.za\\Images\\LOYALTY-LW.png", 
      "Stores": [ 
       { 
        "StoreID": 2, 
        "StoreNumber": null, 
        "StoreName": "Pos Store", 
        "StoreAddress": "218 Stamford Hill Road", 
        "StoreCity": "Durban", 
        "StoreRegion": "KZN", 
        "StoreCountry": "South Africa" 
       }, 
       { 
        "StoreID": 4, 
        "StoreNumber": null, 
        "StoreName": "Pos Store", 
        "StoreAddress": "218 Mathews Meyiwa Road", 
        "StoreCity": "Durban", 
        "StoreRegion": "KZN", 
        "StoreCountry": "South Africa" 
       }, 
       { 
        "StoreID": 3021, 
        "StoreNumber": null, 
        "StoreName": "Tes tStore", 
        "StoreAddress": "", 
        "StoreCity": "", 
        "StoreRegion": "", 
        "StoreCountry": "" 
       }, 
       { 
        "StoreID": 3061, 
        "StoreNumber": null, 
        "StoreName": "tEST", 
        "StoreAddress": "", 
        "StoreCity": "Durban", 
        "StoreRegion": "", 
        "StoreCountry": "" 
       } 

      ] 
     } 
    ], 
    "IsError": false, 
    "ErrorMessage": null 
} 

Klasse:

public class Store 
     { 
      public class Credentials 
      { 
       public string Token { get; set; } 
       public bool Authenticated { get; set; } 
       public object SecretKey { get; set; } 
      } 

      public class StoreDetails 
      { 
       public int StoreID { get; set; } 
       public object StoreNumber { get; set; } 
       public string StoreName { get; set; } 
       public string StoreAddress { get; set; } 
       public string StoreCity { get; set; } 
       public string StoreRegion { get; set; } 
       public string StoreCountry { get; set; } 
      } 

      public class Company 
      { 
       public int CustomerID { get; set; } 
       public string CompanyName { get; set; } 
       public string CompanyLogo { get; set; } 
       public IList<Store> Stores { get; set; } 
      } 

      public class Stores 
      { 
       public Credentials Credentials { get; set; } 
       public IList<Company> Companies { get; set; } 
       public bool IsError { get; set; } 
       public object ErrorMessage { get; set; } 
      } 
     } 

Anfrage:

public async void LoadData() 
     { 
      Store.Stores store = new Store.Stores(); 
      try 
      { 
       var content = ""; 
       HttpClient client = new HttpClient(); 
       var RestUrl = "/api/Company/GetCustomerCompanies"; 
       client.BaseAddress = new Uri(RestUrl); 

       client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 
       client.DefaultRequestHeaders.Add("X-Giftworx-App", "K6Zi8VXfqWuthxgn3YEfrU6Bj/EKM7BqvSZcatFgvMx408yadbE+Qj6IuTnZ++C9q4Ty1W2f1quNYMKZxFBNZg=="); 
       HttpResponseMessage response = await client.GetAsync(RestUrl); 
       content = await response.Content.ReadAsStringAsync(); 

       JObject jsonResponse = JObject.Parse(content); 
       JObject objResponse = (JObject)jsonResponse["Companies"]; 
       Dictionary<string, JArray> Items = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, JArray>>(objResponse.ToString()); 


       MainListView.ItemsSource = Items.ToList(); 
      } 
      catch(Exception ex) 
      { 
       string exception = ex.Message; 
      } 


     } 
+3

Async Methoden sollten nicht leer zurück. Sie können sie nicht erwarten und daher können Sie keine Ausnahmen behandeln. Auch, warum nicht einfach zu "Store" deserialisieren? – Crowcoder

Antwort

1

Sie versuchen, de Serialisierung in ein Wörterbuch auf dieser Linie:

Dictionary<string, JArray> Items = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, JArray>>(objResponse.ToString()); 

Versuchen Sie, die Klasse mit Ihnen erstellt:

var Items = Newtonsoft.Json.JsonConvert.DeserializeObject<Stores>(content); 
+0

sollte DeserializeObject –

+0

Corrected sein. Vielen Dank. –

0

eine Klasse Modellierung auf einer JSON basierten problematisch sein könnte. Stellen Sie sicher, dass Ihre Modellklasse genau mit Ihrem JSON übereinstimmt, und überprüfen Sie die entsprechenden Datentypen.

Hier ist ein Link, um eine C# Klasse zu erstellen, basierend auf einem JSON-String: http://json2csharp.com/

+0

Darüber hinaus können Sie in Visual Studio einfach den JSON in die Zwischenablage kopieren und Bearbeiten> Inhalte einfügen> JSON als Klassen einfügen wählen –

Verwandte Themen