2013-10-25 14 views
5

Ich habe einige Probleme zu verstehen, wie man JSON.net verwendet, um eine JSON-Datei zu lesen.Lesen von JSON-Dateien mit C# und JSON.net

Die Datei wie folgt sucht:

"version": { 
    "files": [ 
     { 
      "url": "http://www.url.com/", 
      "name": "someName" 
     }, 
     { 
      "name": "someOtherName" 
      "url": "http://www.url.com/" 
      "clientreq": true 
     }, .... 

Ich weiß nicht wirklich viel Ahnung, wie ich diese Datei lesen kann .. Was ich tun müssen, um die Zeilen zu lesen und die Datei über die Download " URL ".. Ich weiß, wie man Dateien usw. herunterlädt, aber ich weiß nicht, wie ich JSON.net verwenden kann, um die JSON-Datei zu lesen und durch jeden Abschnitt zu loeschen und die Datei herunterzuladen.

Können Sie helfen?

Antwort

8

Der einfachste Weg ist Ihr json in ein dynamisches Objekt wie dieses

deserialisieren Dann können Sie seine Eigenschaften eine Schleife Zugang für das Erhalten der Urls

dynamic result = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString); 

var urls = new List<string>(); 

foreach(var file in result.version.files) 
{ 
    urls.Add(file.url); 
} 
+0

Ich endete mit dieser Methode, da es am einfachsten aussah, was zu funktionieren scheint! Vielen Dank. Für Informationen benutzte ich streamreader, um den Inhalt der Datei mit readtoend zu lesen, die ich dann als "jsonString" –

5

http://json2csharp.com/ hilft Ihnen, C# -Klassen basierend auf Ihrem erstellen JSON-Datentyp Sobald Sie Ihre Klassen haben Ihre Daten übereinstimmen, können Sie mit Json.NET deserialisieren und dann mit Ihren Daten arbeiten:

var myMessage = JsonConvert.DeserializeObject<MyMessage>(myString); 
foreach (var file in myMessage.Version.Files) 
{ 
    // download file.Url 
} 

Oder man kann es als dynamic Objekt zugreifen:

dynamic myMessage = JsonConvert.DeserializeObject(myString); 
foreach (var file in myMessage.version.files) 
{ 
    // download file.url 
} 

Wenn Sie Klassen verwenden

public class File 
{ 
    public Uri Url { get; set; } 
    public string Name { get; set; } 
    public bool? ClientReq { get; set; } 
} 

public class Version 
{ 
    public IList<File> Files { get; set; } 
} 

public class MyMessage 
{ 
    public Version Version { get; set; } 
} 

(beachten sie, dass Json.Net intelligent genug, um Eigenschaften abzubilden, wo der Fall anders ist, und die URLs in Uri Objekte drehen) It:, könnten sie sein funktioniert, wenn die Zeichenfolge lautet:

+0

"bezeichne, dass Json.Net intelligent genug ist, Eigenschaften zu mappen, wo der Fall unterschiedlich ist" das stimmt nicht genau, du brauchst um einen CamelCasePropertyNamesContractResolver dafür zu verwenden. –

+1

@EstebanElverdin scheint das standardmäßig zu tun, weil der Code, den ich habe, funktioniert (der 'clientreq' auf' ClientReq' abbildet), ohne explizit einen Contract Resolver anzugeben. –

+0

Ja, Sie haben recht, in Ihrem Beispiel müssen Sie das nicht tun, ich werde den Code, den ich gerade bearbeitet habe, überprüfen und sehen, warum es nicht standardmäßig funktioniert. –