2017-10-05 2 views
2

Ich versuche, meine Web-API, die JSON-Format von meiner asp.net mvc Web-Anwendung zurückgibt zu konsumieren. Wie mein JSON-Format hat Root-Knoten (die Art, wie ich mit OLEDB-Datensatz gefüllt). Ich bekomme immer den folgenden Fehler.Consuming asp.net web.api json funktioniert nicht

kann die aktuelle JSON Objekt nicht Deserialisieren (zB { "name": "value"}) in Typ 'System.Collections.Generic.List'1 [Fileattributes]', weil der Art mit einer JSON Array erfordert (zB [1,2,3]) um korrekt zu deserialisieren. Um diesen Fehler zu beheben, ändern Sie entweder das JSON in ein JSON-Array (zB [1,2,3]) oder ändern Sie den deserialisierten Typ, so dass es ein normaler .NET-Typ ist (zB kein primitiver Typ wie ganze Zahlen, keine Sammlung) Typ wie ein Array oder List<T>), das aus einem JSON Objekt deserialisiert werden kann. JsonObjectAttribute kann auch zu dem Typ hinzugefügt werden, um es zu erzwingen, von einem JSON-Objekt zu deserialisieren. Pfad ‚search‘, Zeile 1, Position 14.

Hier ist der Codebeispiel

string Baseurl = "http://localhost:62602/"; 
client.BaseAddress = new Uri(Baseurl); 
client.DefaultRequestHeaders.Clear(); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
HttpResponseMessage Res = await client.GetAsync("api/FileSearch/?searchTerm=" + searchTerm); 
if (Res.IsSuccessStatusCode) 
{ 
    var fsResponse = Res.Content.ReadAsStringAsync().Result; 
    List<FileAttributes> fileAttribultes = JsonConvert.DeserializeObject<List<FileAttributes>>(fsResponse); 
} 

Und dann folgt ein paar Ideen, habe ich JSON.Parse und SelectToken Wurzelknoten zu entfernen, aber dieses Mal die List<FileAttributes> gibt Daten aber mit Nullwerten

JToken jtok = JObject.Parse(fsResponse).SelectToken("SearchData"); 
List<FileAttributes> fileAttribultes = JsonConvert.DeserializeObject<List<FileAttributes>>(fsResponse); 

Hier ist meine Fileattributes Klasse

public class FileAttributes 
{ 
    public string Name { get; set; } 
    public string Header { get; set; } 
    public string Title { get; set; } 
} 

Ich schätze es, wenn jemand überprüft, was falsch ist in der Deserialisierung von JSON-Teil mit Root-Knoten und was ist der richtige Weg, es zu tun?

von POSTMAN Ausgang

Kopierte
{ "SearchData": [ { "SYSTEM.NAME": "FILE NAME 1" , "SYSTEM.HEADER": "HEADER 1", "SYSTEM.TITLE": "TITLE 1", }, { "SYSTEM.NAME": "FILE NAME 1" , "SYSTEM.HEADER": "HEADER 1", "SYSTEM.TITLE": "TITLE 1", }, { "SYSTEM.NAME": "FILE NAME 1" , "SYSTEM.HEADER": "HEADER 1", "SYSTEM.TITLE": "TITLE 1", }] } 
+0

Was bedeutet die JSON aussehen? Die Fehlermeldung zeigt Ihnen, was Sie tun müssen, um das Problem zu lösen. – Nkosi

+0

Hoppla Sorry, habe vergessen, JSON-Beispiel zu erwähnen. Kopiert von POSTMAN Ausgang '{ "search": [{ "SYSTEM.NAME": "FILE NAME 1" "SYSTEM.HEADER": "HEADER 1" "System.Title":„TITLE 1" }, { \t \t "SYSTEM.NAME": "FILE NAME 1" "SYSTEM.HEADER": "HEADER 1" "System.Title": "TITLE 1", }, \t \t { "SYSTEM.NAME": "DATEINAME 1", "SYSTEM.HEADER ":" HEADER 1 ", " SYSTEM.TITEL ":" TITEL 1 ", }] }' – user2178604

Antwort

1

Basierend auf dem JSON das Objektmodell anzupassen aktualisiert werden muss. Dazu muss auch das Attribut JsonProperty gehören, damit die JSON-Schlüssel den Eigenschaften der Klasse entsprechen.

public class FileAttributes { 
    [JsonProperty("SYSTEM.NAME")] 
    public string Name { get; set; } 
    [JsonProperty("SYSTEM.HEADER")] 
    public string Header { get; set; } 
    [JsonProperty("SYSTEM.TITLE")] 
    public string Title { get; set; } 
} 

public class RootObject { 
    public IList<FileAttributes> SearchData { get; set; } 
} 

aktualisieren Sie dann den Aufruf an den Dienst entsprechend

string Baseurl = "http://localhost:62602/"; 
client.BaseAddress = new Uri(Baseurl); 
client.DefaultRequestHeaders.Clear(); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
var response = await client.GetAsync("api/FileSearch/?searchTerm=" + searchTerm); 
if (response.IsSuccessStatusCode) { 
    var json = await response.Content.ReadAsStringAsync(); 
    RootObject result = JsonConvert.DeserializeObject<RootObject>(json); 
    var fileAttribultes = result.SearchData; 
    //... 
}