330 votes

Désérialisation de JSON en objet .NET à l'aide de Newtonsoft (ou LINQ to JSON peut-être ?)

Je sais qu'il y a quelques messages sur Newtonsoft, alors j'espère que ce n'est pas une répétition... J'essaie de convertir les données JSON renvoyées par l'API de Kazaa en une sorte d'objet sympa.

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album");
StreamReader reader = new StreamReader(stream);

List<string> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(reader.Read().ToString());

foreach (string item in list)
{
    Console.WriteLine(item);
}

//Console.WriteLine(reader.ReadLine());
stream.Close();

Cette ligne JsonConvert est juste la plus récente que j'ai essayée... Je n'ai pas tout compris et j'espérais éliminer certains problèmes en vous demandant votre avis. A l'origine, j'essayais de le convertir en un dictionnaire ou quelque chose comme ça... et en fait, j'ai juste besoin de saisir quelques valeurs là-dedans, donc à en juger par la documentation, peut-être que LINQ to JSON de Newtonsoft serait un meilleur choix ? Réflexions/Liens ?

Voici un exemple de données de retour JSON :

{
  "page": 1,
  "total_pages": 8,
  "total_entries": 74,
  "q": "muse",
  "albums": [
    {
      "name": "Muse",
      "permalink": "Muse",
      "cover_image_url": "http://image.kazaa.com/images/69/01672812 1569/Yaron_Herman_Trio/Muse/Yaron_Herman_Trio-Muse_1.jpg",
      "id": 93098,
      "artist_name": "Yaron Herman Trio"
    },
    {
      "name": "Muse",
      "permalink": "Muse",
      "cover_image_url": "htt p://image.kazaa.com/images/54/888880301154/Candy_Lo/Muse/Candy_Lo-Muse_1.jpg",
      "i d": 102702,
      "artist_name": "\u76e7\u5de7\u97f3"
    },
    {
      "name": "Absolution",
      "permalink": " Absolution",
      "cover_image_url": "http://image.kazaa.com/images/65/093624873365/Mus e/Absolution/Muse-Absolution_1.jpg",
      "id": 48896,
      "artist_name": "Muse"
    },
    {
      "name": "Ab solution",
      "permalink": "Absolution-2",
      "cover_image_url": "http://image.kazaa.com/i mages/20/825646911820/Muse/Absolution/Muse-Absolution_1.jpg",
      "id": 118573,
      "artist _name": "Muse"
    },
    {
      "name": "Black Holes And Revelations",
      "permalink": "Black-Holes-An d-Revelations",
      "cover_image_url": "http://image.kazaa.com/images/66/093624428466/ Muse/Black_Holes_And_Revelations/Muse-Black_Holes_And_Revelations_1.jpg",
      "id": 48813,
      "artist_name": "Muse"
    },
    {
      "name": "Black Holes And Revelations",
      "permalink": "Bla ck-Holes-And-Revelations-2",
      "cover_image_url": "http://image.kazaa.com/images/86/ 825646911486/Muse/Black_Holes_And_Revelations/Muse-Black_Holes_And_Revelations_1 .jpg",
      "id": 118543,
      "artist_name": "Muse"
    },
    {
      "name": "Origin Of Symmetry",
      "permalink": "Origin-Of-Symmetry",
      "cover_image_url": "http://image.kazaa.com/images/29/825646 912629/Muse/Origin_Of_Symmetry/Muse-Origin_Of_Symmetry_1.jpg",
      "id": 120491,
      "artis t_name": "Muse"
    },
    {
      "name": "Showbiz",
      "permalink": "Showbiz",
      "cover_image_url": "http: //image.kazaa.com/images/68/825646182268/Muse/Showbiz/Muse-Showbiz_1.jpg",
      "id": 60444,
      "artist_name": "Muse"
    },
    {
      "name": "Showbiz",
      "permalink": "Showbiz-2",
      "cover_imag e_url": "http://image.kazaa.com/images/50/825646912650/Muse/Showbiz/Muse-Showbiz_ 1.jpg",
      "id": 118545,
      "artist_name": "Muse"
    },
    {
      "name": "The Resistance",
      "permalink": "T he-Resistance",
      "cover_image_url": "http://image.kazaa.com/images/36/825646864836/ Muse/The_Resistance/Muse-The_Resistance_1.jpg",
      "id": 121171,
      "artist_name": "Muse"
    }
  ],
  "per_page": 10
}

J'ai lu un peu plus et j'ai découvert que le LINQ to JSON de Newtonsoft est exactement ce que je voulais... en utilisant WebClient, Stream, StreamReader et Newtonsoft... je peux aller chercher des données JSON chez Kazaa, extraire une URL, télécharger le fichier et faire tout cela en sept lignes de code ! J'adore ça.

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album");
StreamReader reader = new StreamReader(stream);

Newtonsoft.Json.Linq.JObject jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());

// Instead of WriteLine, 2 or 3 lines of code here using WebClient to download the file
Console.WriteLine((string)jObject["albums"][0]["cover_image_url"]);
stream.Close();

Cet article reçoit tellement de visites que j'ai pensé qu'il serait utile d'inclure les éléments "d'utilisation" qui sont discutés dans les commentaires.

using(var client = new WebClient())
using(var stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album"))
using (var reader = new StreamReader(stream))
{
    var jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());
    Console.WriteLine((string) jObject["albums"][0]["cover_image_url"]);
}

7 votes

Un bon exemple, merci. Juste une suggestion : vous l'avez peut-être laissé de côté par souci de concision, mais puisque WebClient , Stream y StreamReader tous les outils IDisposable vous pourriez ajouter des using à votre code.

0 votes

Ah oui, bien vu...(en fait, c'était juste une application de console que je lançais rapidement pour faire des recherches pour les tâches que j'ai à faire). Maintenant, je vais chercher la dernière pièce du puzzle, le cryptage HLS+AES :) ugh...lol

0 votes

La solution de Newtonsoft ne désérialise-t-elle pas complètement le JSON ? Tout comme la solution de @arcain.

12voto

Arun Prasad E S Points 3375

Liste dynamique Loosely Typed - Désérialiser et lire les valeurs

// First serializing
dynamic collection = new { stud = stud_datatable }; // The stud_datable is the list or data table
string jsonString = JsonConvert.SerializeObject(collection);

// Second Deserializing
dynamic StudList = JsonConvert.DeserializeObject(jsonString);

var stud = StudList.stud;
foreach (var detail in stud)
{
    var Address = detail["stud_address"]; // Access Address data;
}

9voto

Blairg23 Points 78

J'aime cette méthode :

using Newtonsoft.Json.Linq;
// jsonString is your JSON-formatted string
JObject jsonObj = JObject.Parse(jsonString);
Dictionary<string, object> dictObj = jsonObj.ToObject<Dictionary<string, object>>();

Vous pouvez maintenant accéder à tout ce que vous voulez en utilisant le dictObj comme un dictionnaire. Vous pouvez également utiliser Dictionary<string, string> si vous préférez obtenir les valeurs sous forme de chaînes de caractères.

Vous pouvez utiliser cette même méthode pour effectuer un moulage en tant que n'importe quel type d'objet .NET.

2 votes

Je trouve cette méthode très agréable pour deux raisons : 1) lorsque vous ne vous souciez pas du type de données (tout est une chaîne), et 2) il est pratique de travailler avec un dictionnaire des valeurs.

7voto

Tony Anderson Points 71

De même, si vous recherchez simplement une valeur spécifique imbriquée dans le contenu JSON, vous pouvez procéder comme suit :

yourJObject.GetValue("jsonObjectName").Value<string>("jsonPropertyName");

Et ainsi de suite.

Cela peut être utile si vous ne voulez pas supporter le coût de la conversion de l'ensemble du JSON en un objet C#.

2voto

Sloomy Points 71

J'ai besoin d'une classe d'exclusion pour json :

 public static class JsonExtentions
    {
        public static string SerializeToJson(this object SourceObject) { return Newtonsoft.Json.JsonConvert.SerializeObject(SourceObject); }

        public static T JsonToObject<T>(this string JsonString) { return (T)Newtonsoft.Json.JsonConvert.DeserializeObject<T>(JsonString); }
}

Design-Pattern :

 public class Myobject
    {
        public Myobject(){}
        public string prop1 { get; set; }

        public static Myobject  GetObject(string JsonString){return  JsonExtentions.JsonToObject<Myobject>(JsonString);}
        public  string ToJson(string JsonString){return JsonExtentions.SerializeToJson(this);}
    }

Utilisation :

   Myobject dd= Myobject.GetObject(jsonstring);

                 Console.WriteLine(dd.prop1);

0 votes

1voto

todd.pund Points 659

Je suis arrivé assez tard, mais j'ai rencontré ce problème aujourd'hui au travail. Voici comment j'ai résolu le problème.

J'accédais à une API tierce pour récupérer une liste de livres. L'objet renvoyait un objet JSON massif contenant environ 20+ champs, dont je n'avais besoin que de l'ID sous forme d'un objet List string. J'ai utilisé linq sur l'objet dynamique pour récupérer le champ spécifique dont j'avais besoin, puis je l'ai inséré dans mon objet List string.

dynamic content = JsonConvert.DeserializeObject(requestContent);
var contentCodes = ((IEnumerable<dynamic>)content).Where(p => p._id != null).Select(p=>p._id).ToList();

List<string> codes = new List<string>();

foreach (var code in contentCodes)
{
    codes.Add(code?.ToString());
}

1 votes

codes.Add(code?.ToString()) ajoutera un null pour tout code manquant. Le site ? n'est pas dans une position qui peut arrêter codes.Add d'exécution. Vous voulez probablement if (code != null) ...

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