【问题标题】:Trying to receive JSON with JSON.net尝试使用 JSON.net 接收 JSON
【发布时间】:2015-05-14 04:00:19
【问题描述】:

我已经开始构建一个应用程序来从 World Weather Online 获取潮汐信息、天气信息、地图功能等,但它无法获得 JSON 响应。

我已经通过 NuGet 安装了 JSON.net,运行的是 Windows 8.1。我什至只能通过将我的 JSON URL 粘贴到实际浏览器中来查看数据。然后使用它在 json2sharp 的输出在下面创建我的代码的底部。

试过http://www.codeproject.com/Tips/397574/Use-Csharp-to-get-JSON-Data-from-the-Web-and-Map-iHow to get a json string from url?

using System;
using System.Net;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using GMap.NET.WindowsForms;
using GMap.NET;
using GMap.NET.MapProviders;
using System.Xml.Linq;
using System.Xml;
using System.IO;
using System.Web;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using RestSharp;
using Newtonsoft.Json.Utilities;





namespace EOD_Assistant
{


    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();



        }

        private void myMap_Load(object sender, EventArgs e)
        {
            myMap.MapProvider = BingHybridMapProvider.Instance;
            myMap.SetPositionByKeywords("Comox, Canada");
            myMap.MinZoom = 1;
            myMap.MaxZoom = 17;
            myMap.Zoom = 10;
            myMap.CanDragMap = true;
            myMap.MapScaleInfoEnabled = true;

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string url =  "http://api.worldweatheronline.com/free/v2/weather.ashx?q=Campbell%20River&format=json&num_of_days=5&callback=rrr&key=1ccf49ff57a386e570286ae9294b9";

        }

        private void GetWeather()
        {
        }

        private void weatherBtn_Click(object sender, EventArgs e)
        {

        }

        public class WeatherDesc
        {
            public string value { get; set; }
        }

        public class WeatherIconUrl
        {
            public string value { get; set; }
        }

        public class CurrentCondition
        {
            public string cloudcover { get; set; }
            public string FeelsLikeC { get; set; }
            public string FeelsLikeF { get; set; }
            public string humidity { get; set; }
            public string observation_time { get; set; }
            public string precipMM { get; set; }
            public string pressure { get; set; }
            public string temp_C { get; set; }
            public string temp_F { get; set; }
            public string visibility { get; set; }
            public string weatherCode { get; set; }
            public List<WeatherDesc> weatherDesc { get; set; }
            public List<WeatherIconUrl> weatherIconUrl { get; set; }
            public string winddir16Point { get; set; }
            public string winddirDegree { get; set; }
            public string windspeedKmph { get; set; }
            public string windspeedMiles { get; set; }
        }

        public class Request
        {
            public string query { get; set; }
            public string type { get; set; }
        }

        public class Astronomy
        {
            public string moonrise { get; set; }
            public string moonset { get; set; }
            public string sunrise { get; set; }
            public string sunset { get; set; }
        }

        public class WeatherDesc2
        {
            public string value { get; set; }
        }

        public class WeatherIconUrl2
        {
            public string value { get; set; }
        }

        public class Hourly
        {
            public string chanceoffog { get; set; }
            public string chanceoffrost { get; set; }
            public string chanceofhightemp { get; set; }
            public string chanceofovercast { get; set; }
            public string chanceofrain { get; set; }
            public string chanceofremdry { get; set; }
            public string chanceofsnow { get; set; }
            public string chanceofsunshine { get; set; }
            public string chanceofthunder { get; set; }
            public string chanceofwindy { get; set; }
            public string cloudcover { get; set; }
            public string DewPointC { get; set; }
            public string DewPointF { get; set; }
            public string FeelsLikeC { get; set; }
            public string FeelsLikeF { get; set; }
            public string HeatIndexC { get; set; }
            public string HeatIndexF { get; set; }
            public string humidity { get; set; }
            public string precipMM { get; set; }
            public string pressure { get; set; }
            public string tempC { get; set; }
            public string tempF { get; set; }
            public string time { get; set; }
            public string visibility { get; set; }
            public string weatherCode { get; set; }
            public List<WeatherDesc2> weatherDesc { get; set; }
            public List<WeatherIconUrl2> weatherIconUrl { get; set; }
            public string WindChillC { get; set; }
            public string WindChillF { get; set; }
            public string winddir16Point { get; set; }
            public string winddirDegree { get; set; }
            public string WindGustKmph { get; set; }
            public string WindGustMiles { get; set; }
            public string windspeedKmph { get; set; }
            public string windspeedMiles { get; set; }
        }

        public class Weather
        {
            public List<Astronomy> astronomy { get; set; }
            public string date { get; set; }
            public List<Hourly> hourly { get; set; }
            public string maxtempC { get; set; }
            public string maxtempF { get; set; }
            public string mintempC { get; set; }
            public string mintempF { get; set; }
            public string uvIndex { get; set; }
        }

        public class Data
        {
            public List<CurrentCondition> current_condition { get; set; }
            public List<Request> request { get; set; }
            public List<Weather> weather { get; set; }
        }

        public class RootObject
        {
            public Data data { get; set; }
        }

        public class PleaseWORK
        {
            private static T _download_serialized_json_data<T>(string url) where T : new()
            {
                using (var w = new WebClient())
                {
                    var json_data = string.Empty;
                    // attempt to download JSON data as a string
                    try
                    {
                        json_data = w.DownloadString(url);
                    }
                    catch (Exception) { }
                    // if string with JSON data is not empty, deserialize it to class and return its instance 
                    return !string.IsNullOrEmpty(json_data) ? JsonConvert.DeserializeObject<T>(json_data) : new T();
                }
            }
        }
    }
} 

【问题讨论】:

  • 我不确定您使用的是高级版还是免费版,但无论哪种情况,您都绝对不应该共享您的 api 密钥。 . . (如果它是优质的,人们可以使用它,而你最终会付费)
  • 您可能应该澄清出了什么问题。抛出什么异常等等。

标签: c# json weather c3


【解决方案1】:

网址中缺少协议

string url = "http://api.worldweatheronline.com/free/v2/weather.ashx?q=Campbell%20River&format=json&num_of_days=5&callback=rrr&key=xxxxxxxxxxxxxxxxxxxxxxx";
using (var webClient = new System.Net.WebClient())
{
    var json = webClient.DownloadString(url); //THIS GIVES ME AN EXCEPTION ERROR....DUNNO WHY.

}

而且api返回的json字符串不正确,是以“rrr”开头的(当然是在写的时候)

【讨论】:

  • 非常感谢。除了我现在无法填充信息外,没有更多错误。或者更确切地说,我不能使用它。当我输入代码以使用它时,我得到一个错误。当我按下天气按钮时,我试图这样称呼它 var rootObject = _download_serialized_json_data(url);但这不会需要。
【解决方案2】:
   string url = "http://api.worldweatheronline.com/free/v2/weather.ashx?q=Campbell%20River&format=json&num_of_days=5&callback=rrr&key=1ccf49ff57a386e570286ae9294b9";
               var jsonString = web.DownloadString(url).ToString();
               var parseJsonString = jsonString.Split('(', ')')[1];
               var obj = JsonConvert.DeserializeObject<RootObject>(parseJsonString);

这行得通,检查一下...

【讨论】:

    【解决方案3】:

    这样就可以得到JSON字符串

       // httpWebRequest with API URL
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create
            ("http://YourURL.com");
    
            //Method GET
            request.Method = "GET";
    
            //HttpWebResponse for result
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    
    
            //Mapping of status code
            if (response.StatusCode == HttpStatusCode.OK)
            {
                Stream receiveStream = response.GetResponseStream();
                StreamReader readStream = null;
    
                if (response.CharacterSet == "")
                    readStream = new StreamReader(receiveStream);
                else
                    readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
    
                //Get news data in json string
                string data = readStream.ReadToEnd();
    }
    

    之后,您也可以像这样将该字符串转换为 DataSet。

    DataSet ds = new DataSet();
    StringReader reader = new StringReader(data);
    ds.ReadXml(reader);
    

    【讨论】:

      【解决方案4】:

      您使用的网址不正确。

      要获得有效的 json,您应该使用:

      http://api.worldweatheronline.com/free/v2/weather.ashx?q=Campbell%20River&format=json&num_of_days=5&key=xxxxxxxxxxxxxxxxxxxxx
      

      唯一不同的是我取出了&amp;callback=rrr

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        • 2018-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多