【问题标题】:Retrieving data from Random User API with C#使用 C# 从随机用户 API 检索数据
【发布时间】:2019-09-17 10:43:15
【问题描述】:

我正在尝试使用 C#(我是新手)从 Random User API (https://api.randomuser.me/) 接收数据。我有一个 React 前端,并且能够成功地检索和呈现一个人的性别、一个人的位置。但是,当涉及到进一步嵌套的细节时,我很挣扎,例如一个人的名字。我现在的后端代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;

namespace RandomPersonGenerator.Controllers
{
    [Route("api/[controller]")]
    public class GeneratorController : Controller
    {
        [HttpGet("[action]")]
        public async Task<IActionResult> Generate()
        {
            using (var client = new HttpClient())
            {
                try
                {
                    client.BaseAddress = new Uri("https://api.randomuser.me");
                    var response = await client.GetAsync("https://api.randomuser.me");
                    response.EnsureSuccessStatusCode();

                    var stringResult = await response.Content.ReadAsStringAsync();
                    var rawData = JsonConvert.DeserializeObject<PersonAPIResponse>(stringResult);
                    return Ok(new
                    {
                        Gender = rawData.Results.Select(x => x.Gender)
                    });
                }

                catch (HttpRequestException httpRequestException)
                {
                    return BadRequest($"Error generating person: {httpRequestException.Message}");
                }
            }
        }
    }

    public class PersonAPIResponse
    {
        public IEnumerable<PersonDescription> Results { get; set; }
    }

    public class PersonDescription
    {
        public string Gender { get; set; }
    }
}

我试图通过添加以下内容来检索一个人的名字:

Name = rawData.Results.Select(x =&gt; x.Name)Name = rawData.Results.Select(x =&gt; x.Name.First) 但这不是检索数据。有人能帮我从随机用户 API JSON 中选择名字吗?

谢谢!

【问题讨论】:

    标签: c# json api


    【解决方案1】:

    您的问题是您需要更改此行:

    var rawData = JsonConvert.DeserializeObject<PersonAPIResponse>(stringResult);
    

    RootObject person = JsonConvert.DeserializeObject<RootObject>(stringResult);
    

    您应该创建一个新的返回类型类并将其映射到您想要返回的内容中......从人员分配:

    public class PersonAPIResponse
    {
        //.... your own properties 
    }
    

    返回

    return Ok(new PersonAPIResponse
                  {
                     Gender = person.results[0].gender, //first result
                  });
    

    您还需要包含以下类来反序列化字符串:

    public class Name
    {
        public string title { get; set; }
        public string first { get; set; }
        public string last { get; set; }
    }
    
    public class Coordinates
    {
        public string latitude { get; set; }
        public string longitude { get; set; }
    }
    
    public class Timezone
    {
        public string offset { get; set; }
        public string description { get; set; }
    }
    
    public class Location
    {
        public string street { get; set; }
        public string city { get; set; }
        public string state { get; set; }
        public int postcode { get; set; }
        public Coordinates coordinates { get; set; }
        public Timezone timezone { get; set; }
    }
    
    public class Login
    {
        public string uuid { get; set; }
        public string username { get; set; }
        public string password { get; set; }
        public string salt { get; set; }
        public string md5 { get; set; }
        public string sha1 { get; set; }
        public string sha256 { get; set; }
    }
    
    public class Dob
    {
        public DateTime date { get; set; }
        public int age { get; set; }
    }
    
    public class Registered
    {
        public DateTime date { get; set; }
        public int age { get; set; }
    }
    
    public class Id
    {
        public string name { get; set; }
        public object value { get; set; }
    }
    
    public class Picture
    {
        public string large { get; set; }
        public string medium { get; set; }
        public string thumbnail { get; set; }
    }
    
    public class Result
    {
        public string gender { get; set; }
        public Name name { get; set; }
        public Location location { get; set; }
        public string email { get; set; }
        public Login login { get; set; }
        public Dob dob { get; set; }
        public Registered registered { get; set; }
        public string phone { get; set; }
        public string cell { get; set; }
        public Id id { get; set; }
        public Picture picture { get; set; }
        public string nat { get; set; }
    }
    
    public class Info
    {
        public string seed { get; set; }
        public int results { get; set; }
        public int page { get; set; }
        public string version { get; set; }
    }
    
    public class RootObject
    {
        public List<Result> results { get; set; }
        public Info info { get; set; }
    }
    

    【讨论】:

    • 非常感谢您的解释。我已经在我的代码中实现了,但是我在行中出现以下错误“RootObject 不包含 Result 的定义:Gender = person.Result.Gender 请你也解释一下public class PersonAPIResponse 现在应该是什么?我有点被这点弄糊涂了:(对不起
    • PersonAPIResponse 是您想要返回的内容......这取决于您,也可以添加性别字符串或您想要从人映射的任何内容。如果您附加了调试器,它会告诉您名称...当我使用在线工具从您的 json 中创建类时,它基本上会降低所有属性名称,通常这将是 CamelCase,无论如何支持人是“结果” ' 如果您查看 RootObject,您可以看到这一点,PS 您可以将 RootObject 重命名为您喜欢的任何名称。又名person.Result.Gender 将是person.results[0].gender 记住结果是一个集合
    • 为了更加清晰和正确,我更新了相关行,它只是 sudo 代码
    • 感谢@Seabizkit - 再次非常有帮助。但是我仍然收到一个错误:List&lt;Result&gt; does not contain a definition of gender 在同一行
    • 它是因为results 是一个集合,而 [index] 是您访问数组中条目的方式,您需要查看数组的....,因为它的一个你可以完成的列表results.First().Gender 这将是同样的事情......但你需要再次研究和查看这些东西
    【解决方案2】:
    {
        public class Name
        {
            public string Title { get; set; }
            public string First { get; set; }
            public string Last { get; set; }
        }
    
        public class Result
        {
            public Name Name { get; set; }
        }
    
        public class Person
        {
            public List<Result> Results { get; set; }
        }
    
        public async Task<Name> GetPersonAsync()
        {
            HttpClient client = new HttpClient
            {
                BaseAddress = new Uri("https://api.randomuser.me")
            };
            HttpResponseMessage response = await client.GetAsync("https://randomuser.me/api/");
            response.EnsureSuccessStatusCode();
     
            var stringResult = await response.Content.ReadAsStringAsync();
            Person root = JsonConvert.DeserializeObject<Person>(stringResult);
            Console.WriteLine(root.Results[0].Name.Last);
            return root.Results[0].Name;
        }
    
    }
    

    【讨论】:

    • 请不要在这里转储代码。你能edit 解释一下你在做什么以及这对这个线程有何贡献吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2014-03-23
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多