【问题标题】:Parse Google Calculator with Json in Windows Phone 7 / C#?在 Windows Phone 7 / C# 中使用 Json 解析谷歌计算器?
【发布时间】:2011-11-03 22:51:58
【问题描述】:

我目前正在为 WP7 申请,我正在实施货币兑换解决方案。我也可以使用 CSV 来实现,但是每次我找到一个看起来不错的 sn-p(并对其进行修改等)时,我都会遇到 C# Silverlight 库的限制。

所以基本上,我现在正试图从 Google Calculator JSON 结果中过滤掉必要的信息。

基本上这是链接:Google Calculator 这是 JSON 的结果:{lhs: "10 U.S. dollars",rhs: "54.2090627 Danish kroner",error: "",icc: true}

现在,如果我想让 textBlock 显示“10 美元 = 54.20 丹麦克朗”,我将如何解析和过滤它?我基本上只需要应用程序点击一个按钮就可以访问网站,获取信息,然后返回上面格式的结果!

【问题讨论】:

  • 您在这里问了几个问题。你应该把你的问题集中在一个问题上,大概是你的标题问题。
  • 你在哪里遇到了麻烦——是解析 JSON,还是从字符串值中提取数字?如果是前者,C#中有几个JSON库你可以试试。
  • 谢谢,我会试试这些库。到目前为止,我一直在尝试几种方法,但是解析它或提取任何东西都没有像我想的那样工作。会尝试更多:)

标签: c# json parsing windows-phone-7


【解决方案1】:

这其实很简单。我将说明如何调用 REST 服务并将 JSON 数据解析为一个类。然后我认为您将能够自己进行字符串连接并显示。

首先添加对 System.ServiceModel.Web 程序集的引用,这将使您能够访问 System.Runtime.Serialization.Json 命名空间中的 DataContractJsonSerializer

接下来,创建一个类来表示 JSON。使用名称与服务返回的 JSON 匹配的自动实现属性:

public class ExchangeRate
{
  public string lhs { get; set; }
  public string rhs { get; set; }
  public string error { get; set; }
  public string icc { get; set; }
}

我假设您想在单击按钮时获取数据,所以这里有一个带有按钮单击处理程序的小应用程序。

using System;
using System.Net;
using System.Runtime.Serialization.Json;
using System.Windows;
using Microsoft.Phone.Controls;

namespace WP7JsonClient
{
  public partial class MainPage : PhoneApplicationPage
  {
    public MainPage()
    {
      InitializeComponent();
    }

    private void button1_Click( object sender, RoutedEventArgs e )
    {
      var client = new WebClient();

      // Callback function written in-line as a lambda statement
      client.OpenReadCompleted +=
        ( s, eargs ) =>
        {
          var serializer = new DataContractJsonSerializer( typeof( ExchangeRate ) );
          var exchangeRate = (ExchangeRate)serializer.ReadObject( eargs.Result );

          // display exchange rate data here...
        };

      var uri = new Uri( "http://www.google.com/ig/calculator?hl=en&q=10USD=?DKK" );
      client.OpenReadAsync( uri );
    }
  }
}

我已将异步回调方法内联编写为 lambda 语句,但您也可以轻松地将其编写为单独的方法。在调用让序列化程序读取对象之后,JSON 数据现在可以作为 JSON 序列化类 (ExchangeRate) 的实例使用,因此您可以直接使用该对象、使用其属性执行数据绑定等等。

【讨论】:

  • 哦,谢谢!我|会尝试让这个工作代替。打印要打印的汇率数据不应该做太多工作:) 但是,有没有办法将小数位数限制为“XX.XX”或类似的? :)
  • 完美运行。谢谢一堆。在尝试了一周的 XML/CSV +++ 之后,我终于让 json 工作了!再次感谢 :)! -
  • @AndrewB,首先将字符串分成几部分,有关选项,请参阅msdn.microsoft.com/en-us/library/ms228362.aspx。然后获取作为数字的字符串部分,并使用 Decimal.TryParse 或 Decimal.Parse 将其转换为十进制值。最后,当您使用 string.Format 格式化十进制值以进行显示时,使用标准格式字符串 (msdn.microsoft.com/en-us/library/dwhawy9k.aspx) 来指示您希望如何格式化该值,包括小数点后的位数。网上有无数的字符串格式化示例。
  • 谢谢!我会检查你的方法。我尝试使用 .Remove 格式/修改文本的方式,但如果货币市场发生突然(和“极端”)变化,.Remove 可能会破坏它。
【解决方案2】:

我建议您使用JSON.NET 的WindowsPhone 版本。 The documentation 应该足以帮助您弄清楚如何从那里获取所需的信息。

【讨论】:

  • 我现在将试用 JSON.NET 库。这似乎是我需要的!谢谢你。如果这里有什么不清楚的地方会报告:)
  • JSON.NET 库很不错,我在很多项目中都使用过它。不要从那个库中拿走任何东西......只是你不需要在这个简单的场景中使用它。我将在单独的答案中展示如何使用 .NET Framework 的 DataContractJsonSerializer 将 JSON 反序列化为 .NET 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2013-01-22
  • 1970-01-01
相关资源
最近更新 更多