所以我用c# xamarin做了一个基本的股票应用程序,可以用Alpha Vantage API拉股票报价。我有我认为可能会工作,但它根本不工作。是的,这是一个学校项目,所以我不希望人们只是做它。此应用程序的目的是使用API,我需要显示用户从第一页输入股票代码后它提供的数据我需要使用api发送该符号,但我不确定是否拉入了JSON对象,也不知道在正确检索JSON时如何到达对象中的每个字段。这段代码是我正在尝试的,但我没有将任何信息填充到任何textView中。
namespace Stock_Quote
{
[Activity(Label = "StockInfoActivity1")]
public class StockInfoActivity1 : Activity
{
private ISharedPreferences prefs = Application.Context.GetSharedPreferences("APP_DATA", FileCreationMode.Private);
TextView txtSymbol, txtOpen, txtClose, txtHigh, txtLow, txtVolume;
string webservice_url = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=";
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Create your application here
SetContentView(Resource.Layout.activity_stock_info);
txtSymbol = FindViewById<TextView>(Resource.Id.txtSymbol);
txtOpen = FindViewById<TextView>(Resource.Id.txtOpen);
txtClose = FindViewById<TextView>(Resource.Id.txtClose);
txtHigh = FindViewById<TextView>(Resource.Id.txtHigh);
txtLow = FindViewById<TextView>(Resource.Id.txtLow);
txtVolume = FindViewById<TextView>(Resource.Id.txtVolume);
string current = prefs.GetString("current", "no stok symbol found");
//txtSymbol.Text = current;
try
{
webservice_url = webservice_url + current + "&apikey=AVALIDAPIKEY";
Uri url = new Uri(webservice_url);
var webRequest = WebRequest.Create(url);
if (webRequest != null)
{
webRequest.Method = "GET";
webRequest.ContentType = "application/json";
//Get the response
WebResponse wr = webRequest.GetResponseAsync().Result;
Stream receiveStream = wr.GetResponseStream();
StreamReader reader = new StreamReader(receiveStream);
Stock currentStockInfo = JsonConvert.DeserializeObject<Stock>(reader.ReadToEnd());
if (currentStockInfo.RestResponse.result == null)
{
txtSymbol.Text = "No stock found";
}
else
{
txtSymbol.Text = current;
txtOpen.Text = currentStockInfo.RestResponse.stockInfo.Open;
txtClose.Text = currentStockInfo.RestResponse.stockInfo.Close;
txtHigh.Text = currentStockInfo.RestResponse.stockInfo.High;
txtLow.Text = currentStockInfo.RestResponse.stockInfo.Low;
txtVolume.Text = currentStockInfo.RestResponse.stockInfo.Volume;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
public class Result
{
public string Information { get; set; }
public string Symbol { get; set; }
public string Last { get; set; }
public string Size { get; set; }
public string TimeZone { get; set; }
}
public class StockInfo
{
public string Open { get; set; }
public string High { get; set; }
public string Low { get; set; }
public string Close { get; set; }
public string Volume { get; set; }
}
public class RestResponse
{
public Result result { get; set; }
public StockInfo stockInfo { get; set; }
}
public class Stock
{
public RestResponse RestResponse { get; set; }
}
}
3条答案
按热度按时间u0sqgete1#
从该端点返回的JSON与您的模型不完全匹配。
下面这一行告诉程序如何解析响应:
股票当前股票信息= jsonConvert.DeserializeObject(读取器.读取到结束());
...但响应如下所示:
}
你试图把整个响应变成一个
Stock
对象,这是行不通的。这个响应不是一个Stock
,它是一个有两个对象的响应,其中一个有很多Stock
对象。您 * 可以 * 尝试为此创建一个模型 ,但我建议将整个响应转换为
JObject
(NewtonSoftJSON .NET中的另一个对象)。下面是一个DotNetFiddle,我将它放在一起来演示它是如何工作的。
https://dotnetfiddle.net/Iz8UsD
如果我能补充更多有用的信息,请告诉我。
编辑: 您可能可以在这里使用强类型模型,问题是每个
Stock
都有不同的JSON名称。我不知道如何让解析器将每个Stock
解析为Stock
,同时仍然保留数据。今晚我将不得不使用它。egdjgwm82#
Joe解释的问题是,返回的JSON的形状不允许轻松Map到C#对象。
下面是一个使用C#从AlphaVantage检索股票价格的更简单/更快捷的方法。
它涉及到调用标准的API价格端点,但添加'&datatype=csv'作为URL参数。响应的格式使它很容易Map到C# Poco对象。在下面的示例中,我只是将它Map到AlphaVantageData对象。
下面是示例代码。您可以在Gystlin here中实时运行此代码
siv3szwd3#
我发布这个回复是因为我有一个工作代码,它可以从AlphaVantage Time Series(Daily)解析出一个股票报价列表。然后它会对报价进行一些比较,寻找枢轴点。这部分需要工作,但列表可以从每日提要中正确获取。
这也是需要的。存储信息。