Как я могу использовать IEnumerable, чтобы сделать переменные из json входных данных из HTTP-вызова? - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь использовать приложение для вызова API и для возврата данных, уникальных для пользователя. Я создал отдельный класс для импортированных элементов:

public class ItemList
{
     public class Task : IEnumerable<Task>
     {
          public string variable1 { get; set; }
          ....
     }

     public IEnumerator<Task> GetEnumerator()
     { 
          return taskList.GetEnumerator();
     }

     IEnumerator IEnumerable.GetEnumerator()
     {
          return taskList.GetEnumerator();
     }
}

В отдельном классе я делаю вызов http, который возвращает json для сортировки по задачам.

WebRequest requestObjGet = WebRequest.Create(url);
//headers, etc
responseObjGet = (HttpWebResponse)requestObjGet.GetResponse();

using (Stream stream = responseObjGet.GetResponseStream())
{
    StreamReader sr = new StreamReader(stream);
    strResultTest=sr.ReadToEnd();

    ItemList userActiveItemData = JsonConvert.DeserializeObject<ItemList>(strResultTest);

    foreach(Task item in userActiveITemData)
    { 
       // DO A THING
    }
}

Здесь я получаю сообщение об ошибке, что foreach не может работать с переменными типа ItemList, поскольку ItemList не содержит публикуемого c экземпляра для GetEnumerator.

Может кто-нибудь помочь мне запустить этот l oop?

Ответы [ 3 ]

0 голосов
/ 04 мая 2020

Если вы хотите использовать ItemList в качестве IEnumerable<Task>, то я думаю, что нам нужно переместить ваш класс Task в ту же область, что и ItemList, и заставить ItemList реализовать IEnumerable<Task>.

В приведенном ниже коде я переименовал Task в MyTask, чтобы избежать путаницы с хорошо известным классом System.Threading.Tasks.Task.

public class MyTask
{
    public string variable1 { get; set; }
}

public class ItemList : IEnumerable<MyTask>
{
    public IEnumerable<MyTask> taskList = new List<MyTask>();

    public IEnumerator<MyTask> GetEnumerator()
    {
        return taskList.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return taskList.GetEnumerator();
    }
} 
0 голосов
/ 04 мая 2020

Существует много онлайн-инструментов, которые преобразуют ваш JSON ответ в соответствующую C# модель / ы, поэтому вам нужно всего лишь позвонить JsonConvert.DeserializeObject<T>, чтобы получить доступ к IEnumerable.

Предполагая, что ответ от веб-сервера имеет этот формат {"tasks": [{"variable1":"value1", "variable2":"value2"}, {"variable1":"value1.2", "variable2":"value2.2"}]}, мы получаем следующие C# Модели (https://app.quicktype.io/?l=csharp):

    public partial class TaskModel
    {
        public Task[] Tasks { get; set; }
    }

    public partial class Task
    {
        public string Variable1 { get; set; }
        public string Variable2 { get; set; }
    }

Обратите внимание, что поскольку TaskModel root вы можете называть это как хотите.

Затем мы можем получить доступ к задачам через foreach l oop, например, так:

            WebRequest requestObjGet = WebRequest.Create("http://someurl.com");

            var response = (HttpWebResponse)requestObjGet.GetResponse();

            using (Stream stream = response.GetResponseStream())
            {
                StreamReader sr = new StreamReader(stream);
                var strResultTest = sr.ReadToEnd();

                TaskModel taskModel = JsonConvert.DeserializeObject<TaskModel>(strResultTest);

                foreach (var task in taskModel.Tasks)
                {
                    // DO A THING
                }
            }
0 голосов
/ 04 мая 2020

Класс ItemList не нужен. Вы пытаетесь реализовать IEnumerable интерфейс, его можно заменить простым List<Task> или Task[], который уже реализует IEnumerable.

. Вы можете десериализовать JSON в модель, соответствующую Структура JSON:

var model = JsonConvert.DeserializeObject<TasksModel>(strResultTest);

foreach(Task item in model.Tasks)
{ 
   // DO A THING
}

Модель:

public class TasksModel
{
    [JsonProperty("tasks")]
    public List<Task> Tasks { get; set; }
}
public class Task
{
    [JsonProperty("variable1")]
    public string Variable1 { get; set; }

    [JsonProperty("variable2")]
    public string Variable2 { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...