2 votes

Sauter le parent correctement dans JsonDeserializer

Je reçois un HttpResponseMessage qui ressemble à ceci (données caviardées) :

{
  "tracks" : {
    "href" : "{href_here}",
    "items" : [ {
      "album" : {
        //stuff here
      },
      "name": "{name here}"
    },
    {
      "album" : {
        //more stuff here
      },
      "name": "{other name here}"
    }
  }
}

Mon modèle ressemble à ceci :

using System.Text.Json.Serialization;

namespace ProjectName.Models
{
    public class Track
    {
        [JsonPropertyName("album")]
        public Album Album { get; set; }

        [JsonPropertyName("name")]
        public string Name { get; set; }
    }
}

J'essaie ensuite de désérialiser la réponse de la manière suivante :

var response = await _httpClient.GetAsync("URL HERE");

response.EnsureSuccessStatusCode();

return JsonSerializer.Deserialize<IEnumerable<Track>>(await response.Content.ReadAsStringAsync());

Je voudrais récupérer une liste de Tracks (qui correspond à items en JSON).

Je ne trouve pas de moyen en ligne de "sauter" les propriétés parentales et de ne désérialiser qu'un enfant spécifique (dans ce cas, il s'agit de items ). Je n'ai pas besoin de href (et les autres propriétés que j'ai supprimées).

Y a-t-il un moyen de le faire ?

2voto

Ivan Khorin Points 577
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace StackOverflow
{
    public class Album
    {
    }

    public class Item
    {
        [JsonPropertyName("album")]
        public Album Album { get; set; }
        [JsonPropertyName("name")]
        public string Name { get; set; }
    }

    public class Tracks
    {
        [JsonPropertyName("href")]
        public string Href { get; set; }
        [JsonPropertyName("items")]
        public List<Item> Items { get; set; }
    }

    public class Root
    {
        [JsonPropertyName("tracks")]
        public Tracks Tracks { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var jsonStr = "{\"tracks\":{\"href\":\"{href_here}\", \"items\" : [{\"album\" : { }, \"name\": \"{name here}\"}]}}";

            var root = JsonSerializer.Deserialize<Root>(jsonStr);

           //Here is your "IEnumerable<Track>"
            var items = root.Tracks.Items;
        }
    }
}

Votre modèle doit avoir une telle structure, puis il désérialise vos données comme prévu. Ensuite, vous pouvez utiliser Linq pour amener le résultat à tout format que vous voulez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X