2013-10-25 64 views
5

在理解如何使用JSON.net讀取json文件時遇到了一些麻煩。使用C#和JSON.net讀取JSON文件

該文件看起來像這樣:

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

我真的沒有太多的想法如何,我可以讀取該文件。什麼我需要做的是閱讀的線條和通過下載文件「 url「..我知道如何下載文件等,但我不知道如何使用JSON.net來閱讀json文件並循環遍歷每個部分,並下載文件..

你能協助嗎?

回答

8

最簡單的方法是反序列化JSON成這樣

動態對象然後你就可以訪問它的屬性的循環用於獲取網址

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

var urls = new List<string>(); 

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

我結束了使用這種方法,因爲它看起來最簡單,似乎工作!謝謝一堆。對於我使用streamreader來讀取文件的內容與readtoend,然後我用作「jsonString」 –

5

http://json2csharp.com/幫助您根據創建C#類的JSON數據類型。一旦你有你的類來匹配你的數據,你可以用Json.NET反序列化,然後用你的數據工作:

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

或者你可以訪問它作爲一個dynamic對象:

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

如果您使用類,他們可能是:

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

(注意Json.Net是足夠聰明的映射特性,其中的情況是不同的,並打開URL轉換成開放的對象)它當字符串是這樣的:

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

「請注意,Json.Net足夠聰明,以映射屬性的情況是不同的」,這不完全正確,你需要爲此使用CamelCasePropertyNamesContractResolver。 –

+1

@EstebanElverdin它默認情況下會這樣做,因爲我已經得到了代碼(它將'clientreq'映射到'ClientReq'),而沒有明確指定任何合約解析器。 –

+0

是的,你是對的,沒有必要在你的例子中做,我會檢查一些我正在工作的代碼,看看它爲什麼沒有默認它。 –