Windows控制台应用程序VS2105 C#-使用JSON数据



我有时会不惜一切代价避免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属性的值。

相关内容

  • 没有找到相关文章

最新更新