【问题标题】:Select JSON sub-node选择 JSON 子节点
【发布时间】:2020-03-23 01:52:37
【问题描述】:

我正在查询 Wikipedia API 并得到如下所示的 JSON:

https://en.wikipedia.org/w/api.php?action=query&prop=pageimages&titles=cessna%20172&pithumbsize=500&format=json

{"batchcomplete":"","query":{"normalized":[{"from":"cessna 172","to":"Cessna 172"}],"pages":{"173462":{"pageid":173462,"ns":0,"title":"Cessna 172","thumbnail":{"source":"https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Cessna_172S_Skyhawk_SP%2C_Private_JP6817606.jpg/500px-Cessna_172S_Skyhawk_SP%2C_Private_JP6817606.jpg","width":500,"height":333},"pageimage":"Cessna_172S_Skyhawk_SP,_Private_JP6817606.jpg"}}}}

使用 .Net Core 2.2,从中获取图像缩略图的正确方法是什么(本例中为 source 属性)?

【问题讨论】:

    标签: json asp.net-core


    【解决方案1】:

    解析 JSON 不是 .Net core 2.2 中的内置功能,因此您需要将 Newtonsoft.Json package 添加到带有 dotnet add package Newtonsoft.Json --version 12.0.3 的项目中。

    从那里通过将using Newtonsoft.Json.Linq; 添加到文件顶部来包含Newtonsoft.Json。和using System.Net; 使用WebClient

    代码从那里检索 url 中的字符串。 JObject.Parse 将字符串解析为 JObject。我们可以通过链接索引器获得您想要的属性:["query"]["pages"]["173462"]["thumbnail"]["source"]

    完整来源:

    using System;
    using System.Net;
    using Newtonsoft.Json.Linq;
    
    class Program
    {
        static void Main(string[] args)
        {
            const string url = "https://en.wikipedia.org/w/api.php?action=query&prop=pageimages&titles=cessna%20172&pithumbsize=500&format=json";
            using (WebClient client = new WebClient())
            {
                string rawString = client.DownloadString(url);
                var jsonResult = JObject.Parse(rawString);
                string thumbnail = jsonResult["query"]["pages"]["173462"]["thumbnail"]["source"];
                Console.WriteLine(thumbnail);
            }
        }
    }
    

    【讨论】:

    • 这看起来不错,并且是我采用的方法,您需要在 jsonResult 上使用 ToString,因为无法将 JObject 分配给 string。但是,我得到“序列不包含元素”
    【解决方案2】:

    理想情况下,您必须定义一个类并反序列化 json。示例:

    Batch batch  = JsonConvert.DeserializeObject<Account>(json);
    

    更多详情here.

    但是,有时,为了获得一/两个值,使用整个类结构可能会产生开销。在这种情况下,一种快速的方法可能是动态解析 json。取自here的示例:

    public void JValueParsingTest()
    {
        var jsonString = @"{""Name"":""Rick"",""Company"":""West Wind"",
                            ""Entered"":""2012-03-16T00:03:33.245-10:00""}";
    
        dynamic json = JValue.Parse(jsonString);
    
        // values require casting
        string name = json.Name;
        string company = json.Company;
        DateTime entered = json.Entered;
    
        Assert.AreEqual(name, "Rick");
        Assert.AreEqual(company, "West Wind");            
    }
    

    【讨论】:

    • 这只处理顶级 JSON 吗?根据链接,我需要 3 层深的东西
    • 我没有测试上面的代码,但在我看来,它也可以处理所有的子节点。
    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多