2013-10-25 67 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

是的,你是对的,没有必要在你的例子中做,我会检查一些我正在工作的代码,看看它为什么没有默认它。 –