Bing每日壁纸是微软Bing搜索引擎的特色之一,它每天更换的精美图片给用户带来了视觉上的享受。在过去的五年里,全球用户提交的壮观图片在Bing首页上展示,这些图片不仅令人赞叹,也成为了桌面背景的极佳选择。
Bing桌面应用的“每日壁纸”功能,每天自动更换壁纸,为用户带来宁静的体验,无需手动更换。Windows Phone也采用了类似的功能,用户可以将锁屏设置为Bing每日壁纸。
对这一概念非常感兴趣,并决定尝试自己构建一个应用程序来获取Bing图片。一旦能够获取到图片,就有了许多可能性。可以保存它,并在选择的某个时间后更改桌面背景,或者像桌面壁纸一样将其设置为锁屏,懂意思,关键是获取到Bing每日壁纸。
幸运的是,Bing提供了一个REST API来检索包含Bing图片URL的JSON字符串,将利用这个API。获取图片URL是容易的部分,现在困难的部分是如何从JSON字符串中解析并获取URL。将详细讨论用于解析的不同方法以及如何使用它们来提取Bing图片URL。
首先,需要从BingREST API端点获取JSON字符串。使用HttpClient来获取字符串,可以选择使用Windows.Web.Http或System.Net.Http命名空间。更倾向于选择Windows.Web.Http.HttpClient,原因很简单,System.Net.Http.HttpClient可能会随着时间的推移而被弃用。另一个原因是System.Net.Http.HttpClient只支持.Net语言,而Windows.Web.Http.HttpClient旨在整合所有HTTP API,以支持不同的Windows应用程序语言,因此它支持所有Windows商店应用程序语言。
以下是使用C#语言获取JSON字符串的示例代码:
HttpClient client = new HttpClient();
string strRegion = "en-US";
string strBingImageURL = string.Format("http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n={0}&mkt={1}", _numOfImages, strRegion);
string strJSONString = "";
HttpResponseMessage response = await client.GetAsync(new Uri(strBingImageURL));
strJSONString = await response.Content.ReadAsStringAsync();
现在已经获取了JSON字符串,接下来将解析它。
可以使用三种方法来解析获取到的JSON字符串:
JSON.NET在Windows.Data.Json出现之前就已经存在很长时间了,然而,微软引入了Windows.Data.Json以提供原生支持来解析JSON。要使用JSON.NET,需要添加Newtonsoft Nuget包,这会增加额外的库依赖。个人更喜欢原生方式,但为了这个应用程序的目的,讨论了使用JSON.NET和Windows.Data.Json命名空间解析JSON字符串的两种方式。
以下是使用Windows.Data.Json解析JSON字符串的示例代码:
JsonObject jsonObject;
bool boolParsed = JsonObject.TryParse(_strRawJSONString, out jsonObject);
if (boolParsed)
{
for (int i = 0; i < _numOfImages; i++)
{
_lstBingImageURLs.Add(jsonObject["images"].GetArray()[i].GetObject()["url"].GetString());
}
}
以下是使用LINQ-to-JSON API的JObject解析JSON字符串的示例代码:
JObject jResults = JObject.Parse(_strRawJSONString);
foreach (var image in jResults["images"])
{
_lstBingImageURLs.Add((string)image["url"]);
}
以下是使用DeserializeObject方法解析JSON字符串的示例代码:
for (int i = 0; i < _numOfImages; i++)
{
_lstBingImageURLs.Add(Convert.ToString((JsonConvert.DeserializeObject(_strRawJSONString)).images[i].url));
}
每个URL被转换为位图图像,并动态添加到Stack Panel中,以显示为图像对象。
foreach (string url in _lstBingImageURLs)
{
Image imgbingImage = new Image();
var bingURL = "https://www.bing.com" + url;
BitmapSource imgbingImageSource = new BitmapImage(new Uri(bingURL));
imgbingImage.Source = imgbingImageSource;
spImages.Children.Add(imgbingImage);
}