J'utilise Google Gson pour transformer mon objet Java à JSON. < p> Actuellement, j'ai la structure suivante: p> actuellement un Comment puis-je faire cela à l'aide de gson? p> Edit: J'ai essayé d'utiliser un typeyeadapter pour modifier l'étape.class, mais dans la méthode d'écriture, je ne suis pas capable Pour ajouter mon objet de durée au JSONWriter. p> p> Durée code> est à l'intérieur d'un objet code> objet code>. Je tiens à sauter les données code> objet code> et déplacez l'objet code> de la durée code> dans l'objet code> d'étape code>, comme ceci: p>
4 Réponses :
Je ne pense pas qu'il y a une belle façon de le faire dans le Gson. Peut-être obtenez un objet Java (carte) à partir de JSON initial, supprimez les données, mettez la durée et Serialize à JSON:
Map initial = gson.fromJson(initialJson); // Replace data with duration in this map Map converted = ... String convertedJson = gson.toJson(converted);
Vous pouvez probablement faire cela en écrivant, puis enregistrer un Serializer personnalisé pour étape code>, et en vous assurant de l'intérieur, vous travaillez avec
Durée code> etc., au lieu de
de données code> .
class StepSerializer implements JsonSerializer<Step>
{
public JsonElement serialize (Step src,
Type typeOfSrc,
JsonSerializationContext context)
{
Gson gson = new Gson ();
/* Whenever Step is serialized,
serialize the contained Data correctly. */
JsonObject step = new JsonObject ();
step.add ("start_name", gson.toJsonTree (src.start_name);
step.add ("end_name", gson.toJsonTree (src.end_name);
/* Notice how I'm digging 2 levels deep into 'data.' but adding
JSON elements 1 level deep into 'step' itself. */
step.add ("duration", gson.toJsonTree (src.data.duration);
step.add ("distance", gson.toJsonTree (src.data.distance);
step.add ("location", gson.toJsonTree (src.data.location);
return step;
}
}
Il suffit de Serialize code>, donc
désérialisze code> n'est pas important. Ce qui précède était juste un exemple de ma structure. En fait, mon objet de données contient des champs supplémentaires, qui doivent être inclus dans le
tojsontree code>. Un indice comment je peux faire ça?
Ceci vraiment i> dépend. Montrez un exemple avec deux champs supplémentaires et je vais voir ce que je peux penser. CAVEAT: Ma réponse est basée sur la documentation du GSON. Je n'ai jamais fait de choses étranges comme ça avant.
J'ai mis à jour ma question avec des champs supplémentaires dans l'objet Data-Object.
@Dennismadsen - J'ai mis à jour ma réponse pour refléter votre changement. Bonne chance.
Merci. Existe-t-il un moyen de créer la variable code> code> de l'étape SRC et de supprimer simplement son objet de données? Si cela est possible, je n'aurais plus d'ajouter le nom de départ et de fin.
@Dennismadsen - Il y a un moyen de le faire en utilisant supprimer code>
. Je recommande vivement le reste de la documentation de l'API pour JSONObject également.
@Dennismadsen - Avez-vous réellement implémenté le sérialisateur et voyez-vous que cela fonctionne pour vous, avant de marquer cette réponse correcte? Je ne suis pas trop sûr parce que tout ce que j'ai écrit est basé sur la documentation du GSON. Je n'ai pas testé une seule ligne de code que j'ai écrit, bien que le espère i> est que c'est assez correct.
Oui je l'ai fait. Il a presque fonctionné sauf du fait que j'ai créé un emplacementApactorfactory code> qui modifie tous les emplacements de mon arbre JSON, mais lorsque j'ajouterai manuellement un emplacement, il semble que cela ne soit pas changé par mon
LocationAdapterFactory code>.
courut dans le même problème. La réponse de @arjunshunkar m'a pointé dans la bonne direction. J'ai corrigé la rédaction d'un sérialisateur personnalisé, mais légèrement différent:
public class StepSerializer implements JsonSerializer<Step> { @Override public JsonElement serialize(Step src, Type typeOfSrc, JsonSerializationContext context) { JsonObject step = new JsonObject(); step.add ("start_name", context.serialize(src.start_name); step.add ("end_name", context.serialize(src.end_name); JsonObject data = context.serialize(src.data).getAsJsonObject(); data.entrySet().forEach(entry -> { step.add(entry.getKey(), entry.getValue()); }); return step; } }
Dans ce cas, je vous enregistrer typeeadapter code> pour les données
non imbriquées code>. Dans l'adaptateur
Les champs code> S sont ajoutés à l'objet parent. Pas besoin de créer un adaptateur pour la classe enfermer.