使用C#和JSON.net读取JSON文件

6

我有些困难理解如何使用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文件,循环遍历每个部分并下载文件。

你能帮忙吗?

2个回答

9
最简单的方法是将您的json反序列化为一个动态对象,就像这样
从而可以访问其属性并循环获取URL。
dynamic result = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString);

var urls = new List<string>();

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

最终我使用了这种方法,因为它看起来最简单,而且似乎能够正常工作!非常感谢。需要说明的是,我使用了StreamReader以readToEnd方式读取文件内容,然后将其用作"jsonString"。 - Daniel Jørgensen

6

http://json2csharp.com/ 可以帮助您创建基于JSON数据类型的C#类。一旦您拥有了与数据匹配的类,就可以使用Json.NET进行反序列化,然后处理您的数据:

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

或者您可以将其作为动态对象进行访问:

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 转换为 Uri 对象。当字符串如下时,它可以正常工作:

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

请注意,Json.Net 足够聪明,可以映射属性名称大小写不同的情况。但实际上这并不完全正确,您需要使用 CamelCasePropertyNamesContractResolver 才能实现这一点。 - Esteban Elverdin
1
@EstebanElverdin 看起来默认就是这样做的,因为我已经编写的代码可以正常工作(将 clientreq 映射到 ClientReq),而没有显式指定任何合同解析器。 - Tim S.
是的,你说得对,在你的例子中不需要这样做,我会检查一下我正在处理的一些代码,并查看为什么它没有默认执行。 - Esteban Elverdin
1
感谢提供 http://json2csharp.com/ 的链接,我可以看到自己会经常使用它。如果要自己解析结构,可能需要花费很长时间。 - Family

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接