Sérialisation 101 avec JSON dans Android
Sérialisation 101 avec JSON dans Android
JSON est un format de données merveilleux. Il est léger, facile à utiliser, et a une structure simple qui correspond étroitement à des types de données et les structures disponibles dans toutes les langues de programmation complet (implémentations existent pour plusieurs langages de programmation douzaine). Quand je ne suis pas en utilisant libs11n pour la sérialisation, j'utilise JSON.
Ce poste est sur le point de commencer avec sérialisation à base JSON en Java. Que signifie « sérialisation » signifie? Cela signifie essentiellement « enregistrement et le chargement, » mais à un niveau plus abstrait que simplement / des fichiers. Sérialisation a de nombreuses utilisations, par exemple transmettre des données entre les activités ou services (par exemple GDrive ou le presse-papiers). Pourquoi ne pas utiliser sérialisation intégré Java? Il est très bien pour RPC et d'autres formes de données transitoires, mais son format est pas garanti pour rester stable à travers les invocations, et est donc totalement inadapté pour une utilisation dans le stockage de données d'application à long terme.
Préclignotement. l'API JSON utilisé dans cet article est basé sur la même API json.org construit pour Android (ils ont une version allégée), mais cette copie est légèrement modifiée par rapport à l'original (i il bifurqué il y a quelques années de JSON. org pour un travail sans rapport avec Android). à-dire qu'il se comporte un peu différemment que l'API Android JSON. La différence la plus notable est que, après utilisation de l'API dans plusieurs applications j'ai changé le JSONException vérifié une exception non contrôlée. Cela simplifie grandement l'utilisation pour la majorité des cas (où nous travaillons uniquement avec des données internes « qui ne peut manquer » si nous avons fait notre travail correctement) tout en permettant au client d'attraper explicitement des erreurs si, par exemple ils tentent de de sérialisation des données fournies par l'utilisateur (que nous ne savons pas à l'avance validera JSON). Il a aussi quelques (petits) le support de Java 6, où l'Generics API json.org ne (ils veulent leur être portable à JVMs plus).
Définissons une interface simple pour les classes qui doivent être sérialisables via JSON. On n'a pas besoin de faire cela, et souvent je ne le faisons pas lors de la sérialisation des conteneurs ou des types simples comme des instances de la classe de peinture. Néanmoins, il est une formalité agréable d'avoir et devient souvent plus utile en tant que projet se développe.
En règle générale, quand je sérialiser des données d'applications internes, j'ai tendance à être assez laxiste et prendre la « utilise les valeurs existantes comme défaut » approche, et si désérialisation d'une petite / pièce sans importance des données ne puis-je tendance à ignorer la l'erreur et de récupérer avec un défaut ou recycler la valeur actuelle. Lorsque désérialisation des données fournies par l'utilisateur, nous avons généralement être un peu plus prudent. Depuis Android protège les fichiers privés d'une application de manipulation, il est « assez normalement de supposer » (derniers mots célèbres) que les données d'une application permet d'économiser pour lui-même sera désérialiser correctement.
les amateurs de JSON peuvent remarquer que l'interface ne tient pas compte des données de tableau. Cela est vrai - j'utiliser des tableaux comme jamais de haut niveau / racine objets JSON. Les tableaux sont supportées indirectement par l'intermédiaire de les ajouter en tant que propriétés JsonObject, en utilisant JSONArray comme le type de valeur.
Nous avons besoin d'une classe pour faire sérialisable. Plutôt que de s'arranger un pour des fins de démonstration, nous allons réutilisent un qui fait partie de HGR. plus gros morceaux de données sérialisés de HGR sont des objets android.graphics.Paint (ils représentent probablement 90% de ses besoins de stockage). Avec un peu d'effort, nous pouvons sauver et de les charger via JSON ...
Notez que cette classe ne met pas en œuvre l'interface JSONable nous donc conçu avec soin! Pourquoi pas? Un accident de l'évolution. Lors de la sérialisation de petits objets d'un certain type intégré i utilise normalement des aides statiques plutôt que de mettre en œuvre une classe qui enveloppe simplement la poignée d'origine aux fins d'un appel sérialisation ou désérialisation. Cela dit, l'interface de cette classe est identique à abstraitement l'interface JSONable, sauf que la « cet » objet est passé comme premier paramètre.
(Anecdote: le code ci-dessus ne contient pas les pièces qui traitent le membre de Typeface objets de peinture de ce qui reste comme un exercice au lecteur (il existe plusieurs approches valables).).
Normalement (mais pas toujours) nous avons besoin de sauvegarder les données avant de pouvoir le charger (bien que parfois lecture des données ne sont pas enregistrées par notre application). Alors, voici comment nous le faisons:
C'est tout ce qu'on peut en dire. Nous pouvons maintenant l'enregistrer partout où il est légal d'enregistrer une chaîne.
Ceci est tout aussi simple, et peut être encore plus simple en ajoutant des enveloppes spécifiques de type:
Encore une fois, c'est tout ce qu'il ya à faire. Sachez que le constructeur JSONObject peut lancer une décochée JSONException, et il est une très bonne idée d'essayer / catch qui, en particulier lors de la lecture des données fournies par l'utilisateur. A défaut de le faire conduira à une force proche de l'application sauf si un appelant de niveau supérieur attrape.
Une fois qu'un type est sérialisable, il est utilisable dans un contexte sérialisable qui soutient ce format de sérialisation (dans notre cas JSON). Qu'est-ce que ça veut dire? Cela signifie que nous pouvons maintenant de / sérialisation une carte
Pour aider la nouvelle initiative sur leur chemin, voici quelques routines génériques je trouve utile pour gérer mes fichiers JSON app-privé:
-- stephan beal