我有时会不惜一切代价避免API(这是另一天的争论),但现在是改变这一点的时候了,几个月前我开始为我的应用程序创建API,多亏了这个网站,它发挥了巨大的魅力。
因此,现在我正在创建一个简单的Windows控制台应用程序,它只需要获取API数据,然后提交到数据库中供主应用程序日后使用。
到目前为止,我觉得还不错。
这就是我想到的:
static void Main(string[] args)
{
string pair = "xxx/xxx";
string apiUrl = "http://someURL" + pair;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiUrl);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader readerStream = new StreamReader(responseStream, System.Text.Encoding.GetEncoding("utf-8"));
string json = readerStream.ReadToEnd();
readerStream.Close();
var jo = JObject.Parse(json);
Console.WriteLine("Pair : " + (string)jo["pair"]);
Console.WriteLine("Open : " + (string)jo["openPrice"]);
Console.WriteLine("Close : " + (string)jo["closePrice"]);
Console.WriteLine("Vol : " + (string)jo["vol"]);
Console.ReadKey();
}
现在,这对主源代码来说是非常棒的,但当我更改源代码时(最终它将是多源代码),它就无法工作了。
经过一些调查,似乎略有不同的反应才是罪魁祸首。
API退货看起来像这个
{
"ip":"1.1.1.1","country_code":"AU","country_name":"Australia",
"region_code":"VIC","region_name":"Victoria","city":"Research",
"zip_code":"3095","time_zone":"Australia/Melbourne","latitude":-37.7,
"longitude":145.1833,"metro_code":0
}
替代来源的回报看起来像这个
{
"success":true,"message":"",
"result":[
{"MarketName":"BITCNY-BTC","High":8000.00000001,"Low":7000.00000000,
"Volume":0.02672075, "Last":7000.00000000,"BaseVolume":213.34995000,
"TimeStamp":"2017-02-09T08:38:22.62","Bid":7000.00000001,"Ask":9999.99999999,
"OpenBuyOrders":14,
"OpenSellOrders":20,"PrevDay":8000.00000001,"Created":"2015-12-11T06:31:40.653"
}
]
}
正如我们所看到的,第二个返回的结构不同,对于这个提要,我一直无法解决这个问题,很明显,我的代码是有效的,有点,但显然不是。
我在网上看了看,仍然没有找到解决方案,一方面我不知道我到底在问什么,另一方面谷歌只想谈谈webAPI。
如果有人能给我指明正确的方向,我不希望每次都为我做的工作解决不了任何问题,我必须学会这样或那样做。
如注释中所述,您的字符串是不相关的。您将无法对两个JSON字符串执行相同的操作,因为它们不同。
最好的方法是使用Deserialization
到对象,即将JSON字符串转换为对象,并使用properties
而不是JObject文本。
将您的第一个JSON字符串放入Json2Csharp.com
中,生成了以下类结构:
public class RootObject
{
public string ip { get; set; }
public string country_code { get; set; }
public string country_name { get; set; }
public string region_code { get; set; }
public string region_name { get; set; }
public string city { get; set; }
public string zip_code { get; set; }
public string time_zone { get; set; }
public double latitude { get; set; }
public double longitude { get; set; }
public int metro_code { get; set; }
}
然后,您可以对代码进行一些调整,以提取HTTP request
功能,假设在此实例中只使用JSON字符串,然后简单地将JSON反序列化为对象。
WebRequest()
方法的一个例子是:
private static string WebRequest(string UrlToQuery)
{
using(WebClient client = new WebClient)
{
return client.DownloadString(UrlToQuery);
}
}
(确保您发现任何错误并处理意外响应,我将由您决定!)
然后你可以这样调用这个方法:
string JsonResponse = WebRequest(apiUrl);
和CCD_ 6到CCD_
RootObject deserializedString = JsonConvert.Deserialize<RootObject>(JsonResponse);
然后,您将能够执行以下操作:
Console.WriteLine($"Country name: {deserializedString.country_name}");
它将打印deserializedString
对象的country_name
属性的值。