【问题标题】:How to store each JSON data with restsharper in c#?如何在 c# 中使用 restshaper 存储每个 JSON 数据?
【发布时间】:2020-02-16 02:52:34
【问题描述】:

我需要从 JSON 响应中获取值,我尝试执行以下操作,但 Project 类中的消息框显示为空。

我尝试用 Google 搜索我的问题(还有 restsharp 教程),但直到现在我都无法解决我遇到的问题。我在网上到处都得到了线索,这就是我在过去几天里已经走了多远。

我期望的结果是来自 API 的每个值都进入变量,然后我可以获取每个值。我不想要纯 JSON 内容。

API 类

private async void Submit_Button_Click(object sender, RoutedEventArgs e)
{
    var client = new RestClient("http://apage.com/");
    var request = new RestRequest("api/project");
    request.Method = Method.GET;

    request.AddHeader("Accept", "application/json");

    client.AddDefaultHeader("Authorization",
        string.Format("Bearer {0}", "token goes here"));

    var response = client.Execute(request);

    var deserialize = new JsonDeserializer();
    Project output = deserialize.Deserialize<Project>(response);

    Project project = new Project();
    project.check();
}

项目类

class Project
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Slug { get; set; }
    public string Description { get; set; }
    public string Deadline { get; set; }
    public int User_id { get; set; }
    public string Created_at { get; set; }
    public string Updated_at { get; set; }

    public void check()
    {
        MessageBox.Show(Title);
    }
}

JSON 代码

{
    "projects": [
        {
            "id": 29,
            "title": "a_project",
            "slug": "a_project",
            "description": "f",
            "deadline": "2020-04-08 00:00:00",
            "user_id": 19,
            "created_at": "2020-02-11 16:59:45",
            "updated_at": "2020-02-11 16:59:45"
        }
    ]
}

Github 链接: https://github.com/s1129092/n212/blob/master/WpfApp1/MainWindow.xaml.cs

【问题讨论】:

  • 你不应该用output.check()而不是project.check()吗?
  • Project project = new Project(); 是一个为空的新实例。

标签: c# restsharp


【解决方案1】:

您似乎正在将一个具有一个属性的对象反序列化为一个Project 类对象,该属性包含Project 对象的数组。您的 JSON 示例显示了根对象的属性 projects 包含一个对象数组,因此您需要在类设计中匹配它,以便您的反序列化隐式工作:

class ProjectList
{
    public Project[] Projects { get; set; }
}

然后反序列化您对新 ProjectList 类的响应:

ProjectList output = deserialize.Deserialize<ProjectList>(response);

然后您可以遍历output.Projects 数组来查找您的项目对象。

您的 Submit_Button_Click 方法现在可以像这样工作:

private async void Submit_Button_Click(object sender, RoutedEventArgs e)
{
    var client = new RestClient("http://apage.com/");
    var request = new RestRequest("api/project");
    request.Method = Method.GET;

    request.AddHeader("Accept", "application/json");

    client.AddDefaultHeader("Authorization",
        string.Format("Bearer {0}", "token goes here"));

    var response = client.Execute(request);

    var deserialize = new JsonDeserializer();

    ProjectList output = deserialize.Deserialize<ProjectList>(response);

    Project firstProjectInResponse = output.Projects[0];
    firstProjectInResponse.check();
}

【讨论】:

  • 您好,感谢您的回复。因此,如果我理解正确,我必须首先定义ProjectList,因为这是我的 JSON 的结构。然后创建一个我的 Project 类的数组实例,以便能够一一抓取它?我对此很陌生,例如,我如何能够抓住第一个项目?再次感谢您的回复。 (重新发布以供更新)
  • 没错,您可以像我在上面的答案中那样定义ProjectList 类,那么您不需要做任何额外的工作来反序列化或映射字段。无需创建 Project 对象数组,因为在上面的示例中,output.Projects 属性中已经存在该对象。然后您可以遍历项目以找到您想要的数据,例如,如果您在数组中只有一个项目,或者只想访问第一个项目,您可以像这样访问它:Project p1 = output.Projects[0];
  • 扩展示例以包括对您的 Submit_Button_Click 方法的更改。
  • @n212:我不知道Projects.get 代码应该做什么,您是否在 GitHub 或任何地方提供了更大的代码库以获得更好的上下文?上面带有firstProjectInResponse.check(); 的示例代码对您有用吗?
  • 我认为您在 Project 类对象 (firstProjectInResponse) 上调用的 .ToString() 方法不会获得您正在寻找的数据。您必须像这样单独引用每个属性:tb.Text = firstProjectInResponse.Description; 这会将文本框文本值设置为项目对象的Description 属性值。您需要单独引用每个属性以获取它们的值。
【解决方案2】:

假设你有这样的课程:

public class ProjectsModel
{
    public List<Project> Projects { get; set; }
}

您可以使用以下代码获取响应数据:

var response = client.Execute<ProjectsModel>(request).Data;
var projects = response.Projects;

那么例如:

foreach(Project p in projects)
{
    MessageBox.Show(p.Title);
} 

【讨论】:

    猜你喜欢
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多