Je sais qu'il y a quelques articles sur Newtonsoft, donc j'espère que ce n'est pas exactement une répétition ... J'essaie de convertir les données JSON retournées par l'API de Kazaa en un bel objet en quelque sorte
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 n'est que la plus récente que j'essayais ... Je ne comprends pas tout à fait et j'espérais éliminer un peu de jeu de jambes en vous demandant les gars. J'essayais à l'origine de le convertir en un dictionnaire ou quelque chose ... et en fait, j'ai juste besoin d'y accrocher quelques valeurs, à en juger par la documentation, peut-être que LINQ to JSON de Newtonsoft pourrait être un meilleur choix? Pensées / Liens?
Voici un exemple des 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 fait un peu plus de lecture et j'ai trouvé que LINQ to JSON de Newtonsoft était exactement ce que je voulais ... en utilisant WebClient, Stream, StreamReader et Newtonsoft ... Je peux frapper Kazaa pour les données JSON, extraire une URL, télécharger le fichier et le faire le tout comme sept lignes de code! J'aime cela.
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();
Ce message reçoit tellement de hits que j'ai pensé qu'il pourrait être utile d'inclure les bits "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"]);
}
WebClient
,Stream
etStreamReader
tous les implémentationsIDisposable
, vous voudrez peut-être ajouter quelquesusing
blocs à votre code.Réponses:
Si vous avez juste besoin d'obtenir quelques éléments de l'objet JSON, j'utiliserais la
JObject
classe LINQ to JSON de Json.NET . Par exemple:J'aime cette approche car vous n'avez pas besoin de désérialiser complètement l'objet JSON. Cela est pratique avec les API qui peuvent parfois vous surprendre avec des propriétés d'objet manquantes, comme Twitter.
Documentation: Sérialisation et désérialisation de JSON avec Json.NET et LINQ to JSON avec Json.NET
la source
Vous pouvez utiliser le
dynamic
type C # pour faciliter les choses. Cette technique simplifie également la refacturation car elle ne repose pas sur des chaînes magiques.JSON
La chaîne JSON ci-dessous est une réponse simple d'un appel d'API HTTP et définit deux propriétés:
Id
etName
.C #
Utilisez
JsonConvert.DeserializeObject<dynamic>()
pour désérialiser cette chaîne en un type dynamique, puis accédez simplement à ses propriétés de la manière habituelle.Si vous spécifiez le type de la
results
variable cardynamic
, au lieu d'utiliser levar
mot - clé, les valeurs de propriété se désérialiseront correctement, par exempleId
en unint
et non en unJValue
(merci à GFoley83 pour le commentaire ci-dessous).Remarque : Le lien NuGet pour l'assembly Newtonsoft est http://nuget.org/packages/newtonsoft.json .
Package : Vous pouvez également ajouter le package avec nuget live installer, avec votre projet ouvert, parcourez simplement le package , puis installez-le simplement install, unistall, update , il sera simplement ajouté à votre projet sous Dependencies / NuGet
la source
dynamic results = JsonConvert.DeserializeObject<ExpandoObject>(json);
ici FTW. Il se désérialise correctementId
en un int et non en unJValue
. Voir ici: dotnetfiddle.net/b0WxGJdynamic results = JsonConvert.DeserializeObject<dynamic>(json);
dans VB.NET?Dim results As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(json)
ne marche pas.Avec le
dynamic
mot - clé, il devient vraiment facile d'analyser n'importe quel objet de ce type:la source
Corrigez-moi si je me trompe, mais l'exemple précédent, je pense, est légèrement désynchronisé avec la dernière version de la bibliothèque Json.NET de James Newton.
la source
JObject
, mais le code que j'ai modifié pour ma réponse a été extrait du code utilisant une surcharge de laSelectToken
méthode afin que je puisse supprimer les exceptions si le jeton n'était pas trouvéJToken JToken.SelectToken(string tokenName, bool errorWhenNoMatch)
:, c'est de là que vient la verbosité.Si, comme moi, vous préférez traiter des objets fortement typés ** allez avec:
De cette façon, vous pouvez utiliser intellisense et compiler la vérification des erreurs de type de temps.
Vous pouvez facilement créer les objets requis en copiant votre JSON en mémoire et en le collant en tant qu'objets JSON (Visual Studio -> Édition -> Collage spécial -> Coller JSON en tant que classes).
Voir ici si vous n'avez pas cette option dans Visual Studio.
Vous devrez également vous assurer que votre JSON est valide. Ajoutez votre propre objet au début s'il ne s'agit que d'un tableau d'objets. c'est-à-dire { "obj": [{}, {}, {}]}
** Je sais que la dynamique facilite parfois les choses, mais je suis un peu désolé avec ça.
la source
Liste dynamique typée de manière lâche - Désérialiser et lire les valeurs
la source
J'aime cette méthode:
Vous pouvez désormais accéder à tout ce que vous voulez en utilisant le
dictObj
comme dictionnaire. Vous pouvez aussi utiliserDictionary<string, string>
si vous préférez obtenir les valeurs sous forme de chaînes.Vous pouvez utiliser cette même méthode pour caster comme n'importe quel type d'objet .NET.
la source
De plus, si vous recherchez simplement une valeur spécifique imbriquée dans le contenu JSON, vous pouvez faire quelque chose comme ceci:
Et ainsi de suite.
Cela pourrait aider si vous ne voulez pas supporter le coût de conversion de l'intégralité du JSON en un objet C #.
la source
j'ai recherché une Extionclass pour json:
Design pattern:
Usage:
la source
Assez tard pour cette fête, mais je suis tombé sur ce problème moi-mê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 a renvoyé un objet JSON massif contenant environ 20+ champs, dont j'avais seulement besoin de l'ID en tant qu'objet chaîne de liste. 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 chaîne List.
la source
Obtenez enfin le nom de l'état à partir de JSON
Je vous remercie!
la source