2013-10-25 12 views
5

Sto avendo qualche problema a capire come usare JSON.net per leggere un file JSON.Lettura di file JSON con C# e JSON.net

Il file è in cerca in questo modo:

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

Io davvero non ho molto idea di come posso leggere questo file .. Cosa devo fare è quello di leggere le righe e scaricare il file tramite il " url ".. So come scaricare i file e così via, ma non so come posso usare JSON.net per leggere il file JSON e scorrere ogni sezione e scaricare il file ..

Potete essere d'aiuto?

risposta

8

Il modo più semplice è quello di deserializzare il vostro JSON in un oggetto dinamico come questo

Poi si può accedere alle sue proprietà un ciclo per ottenere gli URL

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

var urls = new List<string>(); 

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

Ho finito per utilizzare questo metodo come sembrava il più semplice che sembra funzionare! Grazie mille. Per informazioni ho usato streamreader per leggere il contenuto del file con readtoend, che poi ho usato come "jsonString" –

5

http://json2csharp.com/ ti aiuta a creare classi C#, sulla base di Tipo di dati JSON. Una volta che avete le vostre classi per abbinare i dati, è possibile deserializzare con Json.NET e poi lavorare con i vostri dati:

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

Oppure è possibile accedervi come un oggetto dynamic:

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

Se si utilizzano le classi , potrebbero essere:

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; } 
} 

(notare che Json.Net è abbastanza intelligente per mappare le proprietà in cui il caso è diverso, e girare gli URL in oggetti Uri) e ' funziona quando la stringa è come:

string myString = @"{""version"": { 
    ""files"": [ 
     { 
      ""url"": ""http://www.url.com/"", 
      ""name"": ""someName"" 
     }, 
     { 
      ""name"": ""someOtherName"", 
      ""url"": ""http://www.url.com/"", 
      ""clientreq"": true 
     }]}}"; 
+0

"nota che Json.Net è abbastanza intelligente per mappare le proprietà dove il caso è diverso" non è esattamente vero, è necessario per usare un CamelCasePropertyNamesContractResolver per quello. –

+1

@EstebanElverdin sembra farlo per impostazione predefinita, quindi, poiché il codice che ho funziona, (che mappa 'clientreq' in' ClientReq') senza specificare esplicitamente alcun risolutore di contratto. –

+0

sì, hai ragione, non c'è bisogno di farlo nel tuo esempio, rivedrò il codice che stavo lavorando e vedere perché non lo ha fatto di default. –

Problemi correlati