- JSON désérialisation avec JSON.net: les bases - Licence Fondamentale d'Informatique
mardi 27 août 2013

JSON désérialisation avec JSON.net: les bases

J'ai été en contemplant un article sur la gestion JSON depuis un certain temps maintenant, mais il s'est avéré être un assez long article. Alors j'avais pensé à essayer quelque chose de nouveau, et écrire une courte série en trois parties.
  • Partie 1 gère les bases
  • Partie 2 poignées désérialisation avancé avec des hiérarchies de classes
  • Partie 3 gère un cache-et-mise à jour des scénarios.
Et c'est la partie 1 ;-)
Cet article en entier en fait se résume à une ligne de code , mais j'ai besoin de faire une dépression certaine hooplah vous montrer comment l'utiliser. Tout commence avec les données. Considérez ce morceau de JSON tout à fait lisible, décrivant quelques dernières Windows Phone modèles.
[
  {
    "Marque": "Nokia", "Type": "Lumia 800",
    "Specs": {"stockage": "16 Go", "Memory": "512", "l'Ecran": "3,7"}
  },
  {
    "Marque": "Nokia", "Type": "Lumia 710",
    "Specs": {"stockage": "8 Go", "Memory": "512", "l'Ecran": "3,7"}
  },  
  {"Marque": "Nokia", "Type": "Lumia 900",
    "Specs": {"stockage": "8 Go", "Memory": "512", "l'Ecran": "4,3"}
  },
  {"Marque": "HTC", "Type": "Titan II",
    "Specs": {"stockage": "16 Go", "Memory": "512", "l'Ecran": "4,7"}
  },
  {"Marque": "HTC", "Type": "Radar",
    "Specs": {"stockage": "8 Go", "Memory": "512", "l'Ecran": "3,8"}
  }
]
JSON est plutôt compact, ce qui est une grande fonctionnalité lorsque vous développez pour les appareils mobiles. Il a aussi quelques inconvénients autant que la programmation de clients est concerné:
  • générer le code client pour lui qui fait tout le parsing et appelant, comme pour SOAP, n'est pas une caractéristique standard de Visual Studio,
  • il est presque impossible à lire pour un être humain ordinaire,
  • déchiffrer dans les classes est beaucoup de travail,
  • codage d'un analyseur syntaxique pour le main n'est pas amusant.
C'est pourquoi vous ne le faites pas. Il ya plusieurs façons de générer des classes à partir de JSON, le plus simple est ce site: json2csharp par Jonathan Keith . Vous copiez un résultat JSON dans la zone de texte supérieure, cliquez sur le bouton "Générer" et à venir à votre cours:Json2Csharp
Il ya plus de sites qui font la même chose, soit dit en passant, mais c'est ce que j'utilise. Prochaines étapes:
  • Lancez Visual Studio
  • Créez un nouveau projet Windows Phone (par exemple JsonDemo)
  • Pinard les classes générées ci-dessus dans le projet. les cookies de bonus si vous les divisez dans des fichiers séparés et d'ajouter des espaces de noms pour eux. Bonus beignet si vous, comme moi, pensent "RootObject» est en fait un nom assez laid pour un objet - donc le changer pour " Téléphone " .
  • Cliquez sur Outils / Library Package Manager / Gérer les paquets NuGet pour Solution (vous ne devez le NuGet Package Manager installé, n'est-ce pas? Sinon, arrêtez ce que vous faites maintenant et obtenez le droit ce cas , vous m'entendez ;)? )
  • Rechercher JSON.Net
  • Cliquez sur Installer. Cela va ajouter une référence à NewtonSoft.Json.dll à votre produit.
  • Ajoutez des références à Microsoft.Phone.Reactive et System.Observable parce qu'ils vont être nécessaires dans l'étape suivante.
Pour rendre le résultat visible, ajouter un peu de XAML dans le panneau de contenu par défaut dans MainPage.xaml - juste un bouton et une zone de liste basé sur un modèle, pas sorcier ici:
<StackPanel>
  <Nom du bouton = "Load"
      VerticalAlignment = "Top"
      Content = "téléphones de charge" Click = "Load_Click" />
  <listbox X:Name="PhoneList" Height="532">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel Orientation="Horizontal">
          <TextBlock Text = "{Binding} Marque" 
                 Marge = "0,0,12,0" />
          <TextBlock Text="{Binding Type}"/>
        </ StackPanel>
      </ DataTemplate>
    </ ListBox.ItemTemplate>
  </ ListBox>
</ StackPanel>
Enfin, MainPage.xaml.cs ouvrir et ajouter la méthode Load_Click comme affichés ci-dessous.
using System;
utilisant System.Collections.Generic;
using System.Net;
utilisant System.Windows;
utilisant Microsoft.Phone.Controls;
utilisant Microsoft.Phone.Reactive;
utilisant Newtonsoft.Json;

namespace JsonDemo
{
  publique MainPage de classe partielle: PhoneApplicationPage
  {
    / / Constructeur
    MainPage publique ()
    {
      InitializeComponent ();
    }

    private void Load_Click (object sender, RoutedEventArgs e)
    {
      var w = new WebClient ();
      Observable
        . FromEvent <DownloadStringCompletedEventArgs> (w, "DownloadStringCompleted")
        . S'abonner (r =>
        {
          var = désérialisée 
            JsonConvert.DeserializeObject <Liste <Phone>> (r.EventArgs.Result);
          PhoneList.ItemsSource = désérialisée;
        });
      w.DownloadStringAsync (
        new Uri ("http://www.schaikweb.net/dotnetbyexample/JSONPhones1.txt"));
    }
  }
}

JsonSerializerEt ça y est, la seule ligne de code que tout cela est à propos. Appelez la méthode DeserializeObject, modèle avec le type de retour que vous voulez, et farcir la chaîne JSON en elle. Résultat: une liste d'objets avec leurs propriétés remplis, même si il ya des choses comme des objets imbriqués (spécifications dans ces cas) et des tableaux à l'intérieur.
Si vous exécutez la solution de démonstration vous obtenez le résultat affiché dans l'image sur la droite. Gardez à l'esprit ce code n'est en aucun cas spécifique de Windows Phone. Il existe des implémentations de JSON.Net pour pratiquement tous les cadres disponibles.Donc, si vous ressentez le besoin d'utiliser ce à partir de Silverlight ou complète. NET: c'est là.
Vous devez, par ailleurs, faire attention à la structure du JSON . Le code que je montre travaille pour une liste . Une liste en JSON commence avec un crochet: [ . Si votre JSON commence par une accolade: { puis vous êtes retourné un seul objet - un objet que l'on appelle la racine. Dans ce cas, votre désérialisation doit code de retourner un objet unique au lieu d'une liste aussi bien, c'est quelque chose comme
var = désérialisée 
     JsonConvert.DeserializeObject <Phone> (r.EventArgs.Result);
Enfin, une pointe de ninja:
  • Cliquez sur Outils / Library Package Manager / Gérer Forfaits NuGet pour Solution nouveau
  • Rechercher SharpGIS.GZipWebClient
  • Cliquez sur Installer
  • Changez "WebClient" dans la méthode Load_Click à SharpGIS.GZipWebClient
Ce plug-in pour remplacer WebClient par Morten Nielsen ajoute le support pour gzip requêtes web comprimé - cela réduit le trafic réseau encore plus loin, augmentant apparemment les performances de chargement de manière significative. Vous ne serez pas vraiment remarqué la différence sur un si petit fichiers de données telle qu'elle est utilisée dans cet échantillon, mais que vos valeurs de retour JSON deviennent plus grandes, ainsi sera l'impact de l'utilisation de cette bibliothèque.
Pour la petite histoire: je ne suis pas malade et je n'ai pas abandonné MVVM, mais j'ai essayé de faire l'exemple le plus simple possible donc oui, j'ai utilisé un peu de code derrière, comme pour ne pas troubler la solution en fioritures architecturales. ;-)
Merci à Matthijs Hoekstra pour me mettre sur la bonne voie pour cela, et à son compatriote # wp7nl développeurLeon Zandman pour corriger quelques fautes de frappe ennuyeux.

0 commentaires:

Enregistrer un commentaire

 
-