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

Windows控制台应用程序VS2105 C#-使用JSON数据,c#,json,json.net,C#,Json,Json.net,有时,我会不惜一切代价避免API(这是另一天的辩论),但改变这种情况的时机已经到来,几个月前,我开始为我的应用程序创建API,多亏了这个网站,它发挥了巨大的魅力 因此,现在我正在创建一个简单的Windows控制台应用程序,它只需获取API数据,然后提交到数据库,供主应用程序在以后使用 到目前为止,一切都很好,至少我是这么想的 这就是我想到的: static void Main(string[] args) { string pair = "xxx/xxx";

有时,我会不惜一切代价避免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"
    }
   ]
}
另一个源的返回如下所示

{
  "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字符串执行相同的操作,因为它们是不同的

最好的方法是使用对象的
反序列化
,即将JSON字符串转换为对象,并使用
属性
而不是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请求
功能,假设您在此实例中只处理JSON字符串,然后将JSON反序列化为对象

WebRequest()
方法的一个示例是:

private static string WebRequest(string UrlToQuery)
{
    using(WebClient client = new WebClient)
    {
        return client.DownloadString(UrlToQuery);
    }
}
(确保您捕捉到任何错误并处理意外响应,我将让您自行决定!)

然后可以这样调用此方法:

string JsonResponse = WebRequest(apiUrl);
并将
反序列化为
RootObject
类型的对象,如下所示:

RootObject deserializedString = JsonConvert.Deserialize<RootObject>(JsonResponse);

这将打印您的
反序列化字符串
对象的
国家/地区名称
属性的值。

略有不同?这些似乎是不相关的反应。解析这些将返回不同的数据。您的应用程序应该能够解析不同的结果,并在需要时将其转换为公共结果。但在这种情况下,没有什么共同之处。顺便问一下,这个问题与Visual Studio、Web API、Google或控制台应用程序有什么关系?它的VS和控制台是用VS完成的Windows控制台应用程序,我不经常使用这些地方,我正在尽我所能提供一些帮助所需的信息。就像我说的,我真的不知道我在问什么,我的意思是产生一个部分的结果,但不是一个完整的结果。api的引用纯粹是为了证明我所挣扎的差异。由于我计划使用的所有API的结构都与这两个示例相同。因此,只需使用
HttpClient
GetStringAsync
,就可以将代码减半。这也更安全——您的代码忘记处理对象。未屏蔽的响应是到服务器的开放连接,换句话说,没有。请整理一下帖子,问一个具体的问题。您发布了两个完全不相关的字符串-一个是地理信息,另一个是定价数据。你能从中产生什么“部分结果”?他们没有共同点哦,我明白了,我想。我的方法很简单,基于以上(尚未尝试过)我需要为我想要使用的每个API端点提供一个处理程序(请放心),因为每个端点可能提供稍微不同的响应。这里的问题本身就是我对这一点的理解。我会开始工作,看看我能想出什么,然后用finito产品向大家汇报。Thx JayYeah您将需要一个用于单个响应的新类结构,或者您可以动态地反序列化JSON字符串,但是您必须为每个不同类型的响应构建处理程序。对对象进行反序列化只会让生活更轻松,而且它允许您轻松地构建对象集合并处理数据。出于某种原因,我不能接受您的回复。我更新了我不雅观的解决方案的OP发现“接受为答案”按钮盯着我的脸:)