Невозможно получить данные JSON в gridview - PullRequest
0 голосов
/ 24 января 2019

У меня есть этот код ниже, и я пытаюсь получить данные position and result в мои searchlist, но когда я пытаюсь вставить их в код здесь GridView1.DataSource = list;, он продолжает выдавать мне ошибку System.InvalidOperationException: 'Data source is an invalid type. It must be either an IListSource, IEnumerable, or IDataSource.' Что я пытаюсь выполнить чтобы получить данные из Weather and coord в моем виде сетки. Я не уверен, почему это происходит, любая помощь будет принята с благодарностью

    public partial class WebForm1 : System.Web.UI.Page
    {
        public class Result
        {
            public string id { get; set; }
            public string main { get; set; }
            public string description { get; set; }
            public string icon { get; set; }

        }


        public class SearchList
        {
            public Position coord { get; set; }
            public int resultCount { get; set; }
            public Result[] weather { get; set; }
        }
        public class Position
        {
            public double lon { get; set; }
            public double lat { get; set; }
        }


        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            string searchTerm = TextBox1.Text;
            var webRequest = (HttpWebRequest)WebRequest.Create("http://api.openweathermap.org/data/2.5/weather?q="+Server.UrlEncode(searchTerm)+"&units=metric&APPID=*Removed*");
            var webResponse = (HttpWebResponse)webRequest.GetResponse();
            if (webResponse.StatusCode == HttpStatusCode.OK)
            {
                JavaScriptSerializer json = new JavaScriptSerializer();
                StreamReader sr = new StreamReader(webResponse.GetResponseStream());
                string resString = sr.ReadToEnd();

                SearchList list = json.Deserialize<SearchList>(resString);

                GridView1.DataSource = list;
                GridView1.DataBind();
            }
            else
                Label1.Text =
                "Invalid Response" ;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 24 января 2019

То, что я пытаюсь сделать, это получить данные из Weather и координат в моем виде сетки.

Если вы хотите включить все данные в сетку, вам нужно будет спроецироватьэто относится к типу, который включает все.

using System.Linq;

//...

//... code removed for brevity 

var list = json.Deserialize<SearchList>(resString);

var data = list.weather.Select(item => new {
    lon = list.coord.lon,
    lat = list.coord.lat,
    id = item.id,
    main = item.main,
    description = item.description,
    icon = item.icon
});

GridView1.DataSource = data;
GridView1.DataBind();

//... code removed for brevity

Это означает, что lon и lat будут повторяться для каждого элемента в свойстве weather.

Если эти свойствадолжны были отображаться самостоятельно, а затем заполнять другой элемент управления.

0 голосов
/ 24 января 2019

list является просто экземпляром SearchList и поэтому не реализует IEnumerable или другие интерфейсы, упомянутые в исключении (по существу, любой List, Array или другую строго типизированную коллекцию).

Если вы хотите показывать координаты в сетке, то они должны быть свойствами вашего типа Result.

 GridView1.DataSource = list.weather;
 GridView1.DataBind();

Если вы намереваетесь показать только одну координату, то вам следует переосмыслить свой выбор элементов управления или добавить дополнительные элементы управления, такие как Label

[coords] {list.Position} - Label
[id, name, description, icon] {list.weather[0]} - GridViewRow
[id, name, description, icon] {list.weather[1]} - GridViewRow
[id, name, description, icon] {list.weather[2]} - GridViewRow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...