我是新来的,只是学习用JSON解析
我正在检查数组中是否存在值。我的代码是有效的,但我只想要求最短的代码或改进这一点?
这就是我要得到的:m3u8,从数组到4都是随机存在的,所以我尝试了.contains方法。
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;
}

发布于 2020-07-11 15:32:30
你可以利用LINQ来发挥你的优势:
JObject jObject = new JObject();
var m3u = jObject["data"]["program"]["video"]
.Where(i => i.Value<string>().Contains("#EXTM3U"))
.FirstOrDefault()
?["m3u8"].Value<string>();如果没有用的话请告诉我。
发布于 2020-07-11 15:25:16
假设您的json文本类似于(它可能有更多的数据,这并不重要):
{
"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的第一个视频:
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的输出将是:
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类型。
var obj2 = JsonConvert.DeserializeObject<Rootobject>(json);
var video2 = obj2?.data?.program?.video?.FirstOrDefault(v => v.m3u8?.Contains("#EXTM3U") == true);发布于 2020-07-11 15:52:55
好的,这是@Volodymyr的解决方案,非常感谢。
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的解决方案,谢谢。
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);
}
}
}https://stackoverflow.com/questions/62850826
复制相似问题