探索Bing每日壁纸的奥秘

Bing每日壁纸是微软Bing搜索引擎的特色之一,它每天更换的精美图片给用户带来了视觉上的享受。在过去的五年里,全球用户提交的壮观图片在Bing首页上展示,这些图片不仅令人赞叹,也成为了桌面背景的极佳选择。

Bing桌面应用的“每日壁纸”功能,每天自动更换壁纸,为用户带来宁静的体验,无需手动更换。Windows Phone也采用了类似的功能,用户可以将锁屏设置为Bing每日壁纸。

对这一概念非常感兴趣,并决定尝试自己构建一个应用程序来获取Bing图片。一旦能够获取到图片,就有了许多可能性。可以保存它,并在选择的某个时间后更改桌面背景,或者像桌面壁纸一样将其设置为锁屏,懂意思,关键是获取到Bing每日壁纸。

幸运的是,Bing提供了一个REST API来检索包含Bing图片URL的JSON字符串,将利用这个API。获取图片URL是容易的部分,现在困难的部分是如何从JSON字符串中解析并获取URL。将详细讨论用于解析的不同方法以及如何使用它们来提取Bing图片URL。

步骤1:获取JSON字符串

首先,需要从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字符串,接下来将解析它。

步骤2:解析JSON字符串

可以使用三种方法来解析获取到的JSON字符串:

  • 使用Windows.Data.Json(原生方式)
  • 使用LINQ-to-JSON API的JObject(来自JSON.NET,Newtonsoft)
  • 使用dynamic对象和DeserializeObject方法(来自JSON.NET,Newtonsoft)

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); }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485