JsonConvert.DeserializeObject 问题

JsonConvert.DeserializeObject issue

在我的 Windows Phone C# 项目中,我正在使用 unirest 检索信息并尝试反序列化它。这是我拥有的:

public float btc_to_usd { get; set; }

    public BitcoinAPI()
    {
        HttpResponse<string> response =
            Unirest.get("https://montanaflynn-bitcoin-exchange-rate.p.mashape.com/currencies/exchange_rates")
            .header("X-Mashape-Key", "<my key here>")
            .header("Accept", "text/plain")
            .asString();

        string json = response.Body;

        BitcoinAPI info = JsonConvert.DeserializeObject<BitcoinAPI>(json);

    }

然后在MainPage.xaml.cs:

 BitcoinAPI api = new BitcoinAPI();
 TxtCAmount.Text = api.btc_to_usd.ToString();

当我在我的 phone 上部署它时,它挂在加载屏幕上并且应用程序无法启动。这里有什么问题?

你这里有死循环。您正在创建新的 BitcoinAPI 对象并在其构造函数中调用 Unirest.get() 方法。然后 JsonConvert.DeserializeObject() 方法正在创建另一个 BitcoinAPI 对象,因此构造函数被一次又一次地调用......所以它永远不会结束。

我的解决方案是在 BitcoinAPI class 中创建静态方法并保留空构造函数:

public class BitcoinAPI
{
    public BitcoinAPI()
    {
    }

    public static BitcoinAPI FromHttp()
    {
        HttpResponse<string> response =
            Unirest.get("https://montanaflynn-bitcoin-exchange-rate.p.mashape.com/currencies/exchange_rates")
            .header("X-Mashape-Key", "<my key here>")
            .header("Accept", "text/plain")
            .asString();

        string json = response.Body;

        BitcoinAPI info = JsonConvert.DeserializeObject<BitcoinAPI>(json);
        return info;
    }
}

现在,如果您想要从 JSON 反序列化新的 BitcoinAPI 对象,只需调用 BitcoinAPI.FromHttp() 而不是 new BitcoinAPI()