代码之家  ›  专栏  ›  技术社区  ›  Blacktea

从外部api反序列化JSON数据并返回更精简的JSON数据

  •  0
  • Blacktea  · 技术社区  · 2 年前

    我正在练习web api。我的目标是创建一个Get端点,它从外部api接收数据,然后返回一个更精简的结果。 外部api链接: https://www.themealdb.com/api/json/v1/1/search.php?f=a , 外部api数据如下所示:

    {
      "meals": [
        {
          "idMeal": "52768",
          "strMeal": "Apple Frangipan Tart",
          "strDrinkAlternate": null,
          "strCategory": "Dessert",
          .....
        },
        {
          "idMeal": "52893",
          "strMeal": "Apple & Blackberry Crumble",
          ....
         }
       ]
    }
    

    我希望我的端点提供更精简的结果,如下所示:

    [
        {
          "idMeal": "52768",
          "strMeal": "Apple Frangipan Tart"
        },
        {
          "idMeal": "52893",
          "strMeal": "Apple & Blackberry Crumble"
         }
     ] 
    

    以下代码是我到目前为止尝试的代码,结果为空。。我希望我没有偏离正确的道路太远。谢谢

    using System.Text.Json;
    using System.Text.Json.Serialization;
    using Microsoft.AspNetCore.Mvc;
    using RestSharp;
    
    namespace testAPI.Controllers;
    public class Content
    {
        public List<Meal> Meals { get; set; }
    }
    
    public class Meal
    {
        [JsonPropertyName("idMeal")]
        public string MealId { get; set; }
        [JsonPropertyName("strMeal")]
        public string Name { get; set; }
    }
    
    [ApiController]
    [Route("api/[controller]")]
    public class DishesController : ControllerBase
    {
        
        [HttpGet]
        public async Task<IActionResult> GetAllRecipes()
        {
            var client = new RestClient($"https://www.themealdb.com/api/json/v1/1/search.php?f=a");
            var request = new RestRequest();
            var response = await client.ExecuteAsync(request);
            var mealList = JsonSerializer.Deserialize<Content>(response.Content);
            var result = JsonSerializer.Serialize(mealList.Meals);
            
            return Ok(result);
        } 
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Xerillio    2 年前

    我认为问题在于反序列化失败,因为它不知道如何反序列化 Content.Meals 因为JSON中没有名为 Meals -取而代之的是 meals (小写) m ).

    您可以通过添加 JsonPropertyName 属性设置为 Content 课程:

    public class Content
    {
        [JsonPropertyName("meals")]
        public List<Meal> Meals { get; set; }
    }
    

    退房 this fiddle 进行试运行。