Pour implémenter le processus de conversion d'un objet Java en JSON et de son enregistrement dans un fichier, ou de conversion du JSON enregistré en objet Java, utilisez le SDK Android standard org.json, sans parler de Jackson. J'étais un peu dur, et quand j'ai cherché une bonne bibliothèque, j'ai trouvé Moshi de Square, Inc.. J'ai découvert qu'il existe une bibliothèque appelée /), alors je l'ai essayée facilement.
Moshi Moshi est une bibliothèque JSON développée par Square Inc. Il semble qu'il ait été présenté comme l'une des séries Ok à Droidcon Montréal 2015.
A Few 'Ok' Libraries (Droidcon MTL 2015)
Je n'aborderai pas cette fois, mais dans la série Ok, il existe d'autres clients HTTP OkHttp et une bibliothèque d'E / S Okio. / square / ooki /) etc. ont été libérés.
Depuis le 12 août 2017, date de la rédaction de cet article, la dernière version est 1.5.0 (2017/05) / 15).
La taille du fichier est aussi petite que 64 Ko. Cela peut être un avantage dans le développement d'applications Android. Étant donné que Jackson est proche de 1 Mo et Gson de 144 Ko, le dernier 2.8.1 est assez petit.
Selon la documentation de l'API 1.4.0, les classes incluses dans le corps sont:
Si vous jetez un coup d'œil au code source de GitHub Repository, le test trouvera android.util.Pair. J'utilise uniquement reference / android / util / Pair.html), et il semble que l'implémentation de la bibliothèque n'inclut aucune dépendance du SDK Android. Par conséquent, comme les autres séries Ok, il peut être utilisé pour des applications autres que Android.
Notez que Okio est inclus dans la dépendance. Il s'agit également d'une bibliothèque d'E / S qui ne dépend pas du SDK Android.
Dans la version 1.5.0, c'était Apache 2.0 comme les autres séries Ok.
Vous pouvez l'utiliser simplement en ajoutant une ligne.
app/build.gradle
dependencies {
compile 'com.squareup.moshi:moshi:1.5.0'
Selon README of GitHub repository, les paramètres suivants sont requis lors de l'utilisation de Proguard. Ce paramètre n'est pas requis pour une utilisation dans les applications Java.
-dontwarn okio.**
-dontwarn javax.annotation.Nullable
-dontwarn javax.annotation.ParametersAreNonnullByDefault
-keepclasseswithmembers class * {
@com.squareup.moshi.* <methods>;
}
-keep @com.squareup.moshi.JsonQualifier interface *
article | valeur |
---|---|
IDE | Android Studio 2.3 & IntelliJ IDEA |
Java | 1.8.0_131 |
OS | Windows 10 |
Ci-dessous, l'explication de la classe d'échantillon requise pour cette vérification d'opération sera poursuivie, donc [Cliquez ici pour sauter si inutile](# java-% E3% 82% AA% E3% 83% 96% E3 % 82% B8% E3% 82% A7% E3% 82% AF% E3% 83% 88% E3% 81% A8-json-% E3% 82% 92% E7% 9B% B8% E4% BA% 92% E5% A4% 89% E6% 8F% 9B% E3% 81% 99% E3% 82% 8B).
Travaillons avec une classe qui définit les onglets dans un navigateur Web.
Tab.java
import java.util.ArrayList;
import java.util.List;
class Tab {
private List<History> histories;
private int index;
private String thumbnailPath;
private String lastTitle;
Tab() {
histories = new ArrayList<>();
index = -1;
}
// Simple accessor methods...
void addHistory(final History history) {
histories.add(history);
index++;
}
History getLatest() {
return histories.get(index);
}
}
La classe History utilisée dans la classe Tab est une classe simple qui n'a que deux champs de type String, comme indiqué ci-dessous.
History.java
class History {
private final String title;
private final String url;
private History(final String title, final String url) {
this.title = title;
this.url = url;
}
public static History make(final String title, final String url) {
return new History(title, url);
}
public String title() {
return title;
}
public String url() {
return url;
}
}
Initialisez l'objet Tab avant les étapes suivantes.
final Tab tab = new Tab();
tab.setThumbnailPath("file://~~");
tab.setLastTitle("Google");
tab.addHistory(History.make("Title", "URL"));
Moshi utilise une classe appelée JsonAdapter pour effectuer la conversion.
Créez un objet Moshi et utilisez la méthode adaptateur pour spécifier le type à convertir et obtenir l'objet JsonAdapter.
final Moshi moshi = new Moshi.Builder().build();
final JsonAdapter<Tab> tabJsonAdapter = moshi.adapter(Tab.class);
Exécutez avec JsonAdapter.toJson.
final String json = tabJsonAdapter.toJson(tab);
Le JSON suivant est généré.
{"histories":[{"title":"Title","url":"URL"}],"index":0,"lastTitle":"Google","thumbnailPath":"file://~~"}
Pretty Printing Si vous souhaitez générer le JSON dans un état formaté, cela prendra un certain temps.
pretty_print
final Buffer buffer = new Buffer(); // 1.
final JsonWriter prettyPrintWriter = JsonWriter.of(buffer); // 2.
prettyPrintWriter.setIndent(" "); // 3.
try {
tabJsonAdapter.toJson(prettyPrintWriter, tab); // 4.
} catch (final IOException e) {
e.printStackTrace();
}
final String json = buffer.readUtf8(); // 5
Cela peut être un peu déroutant car plus de classes sont utilisées, toJson ne renvoie plus de valeurs directement et toJson lève désormais des exceptions.
Comme indiqué ci-dessous, JSON a été généré avec le retrait spécifié.
{
"histories": [
{
"title": "Title",
"url": "URL"
}
],
"index": 0,
"lastTitle": "Google",
"thumbnailPath": "file://~~"
}
Bien que cela ne soit pas pratique du tout, il semble que la chaîne de caractères passée comme retrait à l'étape 3 ci-dessus n'a pas d'importance. Par exemple, si * 2 est spécifié comme retrait, le JSON suivant sera généré.
{
**"histories": [
****{
******"title": "Title",
******"url": "URL"
****}
**],
**"index": 0,
**"lastTitle": "Google",
**"thumbnailPath": "file://~~"
}
Bien sûr, si vous transmettez ce JSON à JsonAdapter.fromJson, qui sera décrit plus tard, vous obtiendrez une exception car il ne peut pas être analysé en tant que JSON.
Exécutez avec JsonAdapter.fromJson. Cette méthode peut lever une IOException et doit être prise en charge.
try {
final Tab fromJson = tabJsonAdapter.fromJson(json);
} catch (IOException e) {
e.printStackTrace();
}
Affiche le contenu de l'objet Tab obtenu avec une sortie standard.
System.out.println(fromJson.getLastTitle());
System.out.println(fromJson.getThumbnailPath());
System.out.println(fromJson.getLatest().title());
System.out.println(fromJson.getLatest().url());
Google
file://~~
Title
URL
Il semble que la classe History définie par moi-même soit également convertie correctement. Je pense que c'est bien de pouvoir convertir même une classe qui n'a pas de constructeur public.
Le code de cette vérification d'opération est mis dans l'essentiel. https://gist.github.com/toastkidjp/252bc2ac86de2c0a3625b9fed0b9fc62
Moshi est une bibliothèque JSON légère et facile à utiliser. Étant donné que la bibliothèque elle-même n'inclut pas la dépendance du SDK Android, elle peut être utilisée non seulement pour Android, mais également pour le développement d'applications Java normales. J'ai décrit une méthode de conversion mutuelle simple utilisant ce Moshi.
Recommended Posts