【问题标题】:Reading JSON files with C# and JSON.net使用 C# 和 JSON.net 读取 JSON 文件
【发布时间】:2013-10-25 17:35:03
【问题描述】:

我在理解如何使用 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 文件并遍历每个部分,然后下载文件..

你能帮忙吗?

【问题讨论】:

    标签: c# json json.net


    【解决方案1】:

    最简单的方法是将你的 json 反序列化成这样的动态对象

    然后你可以访问它的属性一个循环来获取网址

    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”
    【解决方案2】:

    http://json2csharp.com/ 帮助您基于 JSON 数据类型创建 C# 类。一旦您的类与您的数据相匹配,您就可以使用 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 转换为 Uri 对象)它在字符串如下时起作用:

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

    【讨论】:

    • “请注意,Json.Net 足够聪明,可以映射大小写不同的属性”这并不完全正确,您需要为此使用 CamelCasePropertyNamesContractResolver。
    • @EstebanElverdin 似乎默认情况下会这样做,然后,因为我的代码有效(将clientreq 映射到ClientReq)而没有明确指定任何合约解析器。
    • 是的,你是对的,在你的例子中不需要这样做,我会检查一些我正在工作的代码,看看为什么默认情况下它没有这样做。
    • 感谢json2csharp.com 的链接我可以看到自己使用了很多。我自己要花很长时间才能完成这个结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2020-09-15
    • 2016-03-16
    相关资源
    最近更新 更多