2012-12-05 1 views
6

Ich bin sehr neu mit JSON zu arbeiten und zu tun habe wtih eine Rückkehr von einer API, die ich nicht die Formatierung ändern. Die Rückkehr Beispiel ist: in VS2010 (Ist-Urls entfernt wurde)Deserialisieren JSON mit indiziertes Array in C#

{ 
"body": 
    { 
    "link": 
     {"linkurl": ["www.google.com"]} 
    }, 
"error": null, 
"message": "Data Retrieved successfully", 
"status": true 
} 

Ich bin mit der Newtonsoft.Json Bibliothek mit MVC 3.

Meine Klasse ist:

[JsonObject(MemberSerialization.OptIn)] 
    public class LinksJSON 
    { 
     [JsonProperty] 
     public string link{ get; set; } 

     [JsonProperty] 
     public string message { get; set; } 

     [JsonProperty] 
     public string error { get; set; } 

     [JsonProperty] 
     public bool status { get; set; } 
    } 

Ich Deserialisieren es mit:

private static T _download_serialized_json_data<T>(string url) where T : new() 
    { 
     using (var w = new WebClient()) 
     { 
      var json_data = string.Empty; 
      // attempt to download JSON data as a string 
      try 
      { 
       json_data = w.DownloadString(url); 
      } 
      catch (Exception) { } 
      // if string with JSON data is not empty, deserialize it to class and return its instance 
      return !string.IsNullOrEmpty(json_data) ? JsonConvert.DeserializeObject<T>(json_data) : new T(); 
     } 
    } 

    public string CheckJSONLink() 
    { 

     var url = "<api url-removed for security>"; 

     var outObj = _download_serialized_json_data<LinksJSON>(url); 



     return outObj.Link; 
    } 

aber ich versuche, den Wert von linkurl zu erhalten, die innerhalb Link ein indiziertes Array ist.

Wie würde ich Zugriff auf diese Informationen?

+0

btw, ich alle anderen Felder zugreifen können (Fehler, Meldungs- und Status ohne Probleme). – Crossems

Antwort

1

sollten Sie die folgenden Klassen verwenden:

[JsonObject(MemberSerialization.OptIn)] 
public class LinksJSON 
{ 
    [JsonProperty] 
    public body body { get; set; } 

    [JsonProperty] 
    public string message { get; set; } 

    [JsonProperty] 
    public string error { get; set; } 

    [JsonProperty] 
    public bool status { get; set; } 
} 

[JsonObject(MemberSerialization.OptIn)] 
public class body 
{ 
    [JsonProperty] 
    public link link { get; set; } 
} 

[JsonObject(MemberSerialization.OptIn)] 
public class link 
{ 
    [JsonProperty] 
    public string[] linkurl { get; set; } 
} 
+0

ist, was ich am Ende tun: ähnlich wie oben [JsonObject (MemberSerialization.OptIn)] public class LinksJSON { [JsonProperty] öffentlichen bodylinkdetails Körper; [JsonProperty] öffentlicher Bool-Status; [JsonProperty] öffentliche Zeichenfolge Nachricht; [JsonProperty] öffentlicher Zeichenfolgenfehler; } öffentliche Klasse bodylinkdetails { public link link; } public class Link { public string [] linkurl; } – Crossems

2

Sie haben Ihre Klasse nicht so eingerichtet, dass sie dem JSON entspricht. Ihre Klasse sagt, dass link eine einfache Zeichenfolge ist. Ihr Beispiel zeigt sie als komplexen Typ.

Um es richtig zu deserialisieren, wie Sie erwarten, werden Sie Ihre Klasse ändern müssen, um die JSON zu entsprechen. Speziell link sollte eine Instanz einer Klasse sein.

+0

Danke auch für diese Antwort, da sie die Diskussion mit ihrem Team veranlasste, die richtige Klassenstruktur zur Deserialisierung zu bekommen. Diese – Crossems

Verwandte Themen