我如何使用IEnumerable从http调用的json输入中生成变量?

问题描述 投票:0回答:3

我试图使用一个应用程序来调用一个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 的公共实例,不包含 GetEnumerator.

谁能帮我运行这个循环?

c# json httprequest
3个回答
0
投票

如果您想使用 ItemList 作为 IEnumerable<Task>那么我想我们需要把你的 Task 类的范围,与 ItemList,并使 ItemList 实施 IEnumerable<Task>.

在下面的代码中,我已经重新命名为 TaskMyTask 为了避免与众所周知的 "大国重器 "相混淆。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
投票

该类 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; }
}

0
投票

有许多在线工具可以将你的JSON响应转换为合适的C#模型,所以你需要做的就是调用 JsonConvert.DeserializeObject<T> 来获取对IEnumerable的访问。

假设来自webserver的响应是这样的格式。{"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 是根,你可以随意称呼它。

然后,我们可以像这样在foreach循环中获得对任务的访问权。

            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
                }
            }
© www.soinside.com 2019 - 2024. All rights reserved.