首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSON解析检查数组中是否存在值。

JSON解析检查数组中是否存在值。
EN

Stack Overflow用户
提问于 2020-07-11 15:05:33
回答 3查看 410关注 0票数 1

我是新来的,只是学习用JSON解析

我正在检查数组中是否存在值。我的代码是有效的,但我只想要求最短的代码或改进这一点?

这就是我要得到的:m3u8,从数组到4都是随机存在的,所以我尝试了.contains方法。

代码语言:javascript
复制
  public static async Task<string> GetInfoAsync(string url)
    {
        var resource = await GetWebSourceAsync(url);
        JObject jObject = JObject.Parse(resource);

        var m3u8 = string.Empty;

        if (jObject["data"]["program"]["video"][0].Value<string>().Contains("#EXTM3U"))
        {
            m3u8 = jObject["data"]["program"]["video"][0]["m3u8"].Value<string>();
        }
        else if (jObject["data"]["program"]["video"][1].Value<string>().Contains("#EXTM3U"))
        {
            m3u8 = jObject["data"]["program"]["video"][1]["m3u8"].Value<string>();
        }
        else if (jObject["data"]["program"]["video"][2].Value<string>().Contains("#EXTM3U"))
        {
            m3u8 = jObject["data"]["program"]["video"][2]["m3u8"].Value<string>();
        }
        else if (jObject["data"]["program"]["video"][3].Value<string>().Contains("#EXTM3U"))
        {
            m3u8 = jObject["data"]["program"]["video"][3]["m3u8"].Value<string>();
        }
        else if (jObject["data"]["program"]["video"][4].Value<string>().Contains("#EXTM3U"))
        {
            m3u8 = jObject["data"]["program"]["video"][4]["m3u8"].Value<string>();
        }

        return m3u8;
    }

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-11 15:32:30

你可以利用LINQ来发挥你的优势:

代码语言:javascript
复制
JObject jObject = new JObject();
var m3u = jObject["data"]["program"]["video"]
    .Where(i => i.Value<string>().Contains("#EXTM3U"))
    .FirstOrDefault()
    ?["m3u8"].Value<string>();

如果没有用的话请告诉我。

票数 2
EN

Stack Overflow用户

发布于 2020-07-11 15:25:16

假设您的json文本类似于(它可能有更多的数据,这并不重要):

代码语言:javascript
复制
{
    "data": {
        "program": {
            "video": [
                {
                    "m3u8Url": "http://go.to/video1",
                    "vid": "",
                    "rp": 0 
                },
                {
                    "m3u8Url": "http://go.to/video2",
                    "m3u8": "#EXTM3U #EXT-X-TARGET...",
                    "vid": "",
                    "rp": 0
                },
                {
                    "m3u8Url": "http://go.to/video3",
                    "vid": "",
                    "rp": 0
                }
            ]
        }
    }
}

可以使用以下代码检索包含#EXTM3U的第一个视频:

代码语言:javascript
复制
var anonymousObj = new
{
    data = new
    {
        program = new
        {
            video = new[]
            {
                new
                {
                    m3u8Url = "",
                    m3u8 = "",
                    vid = "",
                    rp = 0
                }
            }
        }
    }
};
var obj = JsonConvert.DeserializeAnonymousType(json, anonymousObj);
var video = obj?.data?.program?.video?.FirstOrDefault(v => v.m3u8?.Contains("#EXTM3U") == true);

其他解决方案,如果您使用的是visual,可以使用编辑器将任何JSON文本映射到类。转到编辑->粘贴特殊->粘贴为类。例如,JSON的输出将是:

代码语言:javascript
复制
public class Rootobject
{
    public Data data { get; set; }
}

public class Data
{
    public Program program { get; set; }
}

public class Program
{
    public Video[] video { get; set; }
}

public class Video
{
    public string m3u8Url { get; set; }
    public string vid { get; set; }
    public int rp { get; set; }
    public string m3u8 { get; set; }
    //it will have other props
}

然后,您可以使用JsonConvert并反序列化为Rootobject类型。

代码语言:javascript
复制
var obj2 = JsonConvert.DeserializeObject<Rootobject>(json);
var video2 = obj2?.data?.program?.video?.FirstOrDefault(v => v.m3u8?.Contains("#EXTM3U") == true);
票数 2
EN

Stack Overflow用户

发布于 2020-07-11 15:52:55

好的,这是@Volodymyr的解决方案,非常感谢。

代码语言:javascript
复制
  public static async Task<string> GetInfoAsync(string url, EpisodeInfo info)
    {
        var resource = await GetWebSourceAsync(url);

        JObject jObject = JObject.Parse(resource);
        return jObject["data"]["program"]["video"]
            .Where(i => i.ToString().Contains("#EXTM3U"))
            .FirstOrDefault()
            ?["m3u8"].ToString();
    }

这里还有@dbvega的解决方案,谢谢。

代码语言:javascript
复制
   public static async Task<string> GetWebSourceAsync(string url)
    {
        var handler = new HttpClientHandler
        {
            Proxy = null,
            UseProxy = false
        };

        using (var client = new HttpClient(handler))
        {
            client.DefaultRequestHeaders.Add("Method", "GET");
            client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36");

            using (HttpResponseMessage response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead))
            {
                response.EnsureSuccessStatusCode();
                string json = await response.Content.ReadAsStringAsync();
                var obj = JsonConvert.DeserializeObject<Rootobject>(json);
                var result = obj?.data?.program?.video?.FirstOrDefault(v => v.m3u8?.Contains("#EXTM3U") == true);
                return JsonConvert.SerializeObject(result, Newtonsoft.Json.Formatting.Indented);
            }
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62850826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档