2
votes

Ignorer une clé dans la conversion JSON en XML

J'utilise la bibliothèque json pour convertir json en xml mais lors de la conversion, je souhaite ignorer un objet json imbriqué à convertir en balises xml.

par exemple.

Le plan json est comme: p>

<name>Customer Analysis</name>
<id>9568</id>
<group>demo</group>
<param>
  <globalSettings>
     {"showLegends":false,"legendPosition":"bottom center"}
  </globalSettings>
</param>

Maintenant, dans l'exemple ci-dessus, je veux en xml avec un json tel qu'il est à l'intérieur. Alors que maintenant, divers éléments sont créés pour showLegends et legendPosition dans globalSettings.

Le XML actuel est le suivant:

<name>Customer Analysis</name>
<id>9568</id>
<group>demo</group>
<param>
  <globalSettings>
     <showLegends>false</showLegends>
     <legendPosition>bottom center</legendPosition>
  </globalSettings>
</param>

Le XML attendu doit être le suivant: p>

{"id":"9568","name":"Customer Analysis","group":"demo","param":{"globalSettings":{"showLegends":false,"legendPosition":"bottom center"}}}

JSONObject json = new JSONObject("{\"id\":\"9568\",\"name\":\"Customer Analysis\",\"group\":\"demo\",\"param\":{\"globalSettings\":{\"showLegends\":false,\"legendPosition\":\"bottom center\"}}}");

    String xml = XML.toString(json);
    System.out.println(xml);

Comment puis-je gérer cela?


10 commentaires

quelle bibliothèque utilisez-vous?


@AdiOhana org.json


quelle est la sortie XML attendue pour l'exemple JSON ci-dessus? pouvez-vous s'il vous plaît l'ajouter au message? il existe un moyen d'ignorer certaines propriétés dans le JSON si vous utilisez POJO - baeldung .com / jackson-ignore-properties-on-serialization stackoverflow.com/questions/5455014/...


@PratikRawlekar puisque vous avez une variable locale var . Ne pouvez-vous pas simplement supprimer la clé et la valeur dont vous n'avez pas besoin avant de la convertir en json, puis avant de la convertir en xml en essayant d'ignorer une clé?


@AdiOhana Veuillez trouver une réponse mise à jour. Je n'utilise pas POJO


@PratikRawlekar Pouvez-vous également publier la sortie actuelle que vous obtenez?


@PratikRawlekar il semble que votre o / p attendu pour la var donnée ne soit même pas un XML valide.


@YugSingh ce n'est qu'un exemple et non le scénario de la vie réelle auquel je suis confronté.


@PratikRawlekar IMO vous devez éditer la question et mentionner clairement vos attentes. Même si vous faites ci-dessus pour apprendre, mais ne devez utiliser que des exemples corrects.


@YugSingh mis à jour avec le dernier exemple dans lequel je suis confronté à un problème


4 Réponses :


0
votes

Vous devez modifier un peu votre json:

    String json = "{\"user\":\"gerry\",\"likes\":[1,2,4],\"followers\":{\"options\":\"{key1:a,key2:b}\"}}";

    JSONObject jsonObject = new JSONObject(json);
    String xml = XML.toString(jsonObject);

    System.out.println(XML.unescape(xml));

notez que les "options" doivent être comme "String" (en forme de JSON), alors l'analyseur XML le traitera comme un chaîne régulière.


0 commentaires

0
votes

Vous devez soit modifier le JSON avant la conversion, soit modifier le XML après la conversion.

Étant donné que de tels ajustements sont si souvent nécessaires, une approche consiste à effectuer la conversion à l'aide de XSLT 3.0 afin que vous ayez une capacité de transformation intégrée à l'outil.


0 commentaires

2
votes

Je pense que vous devez modifier JSON avant de procéder à la conversion. Pouvez-vous essayer ceci ci-dessous?

<followers>{"options":{"key1":"a","key2":"b"}}</followers><user>gerry</user><likes>1</likes><likes>2</likes><likes>4</likes>

résultat:

String json = "{\n" +
        "   \"user\": \"gerry\",\n" +
        "   \"likes\": [1, 2, 4],\n" +
        "   \"followers\": {\n" +
        "      \"options\": {\n" +
        "        \"key1\": \"a\",\n" +
        "        \"key2\": \"b\"\n" +
        "      }        \n" +
        "   }\n" +
        "}";

JSONObject jsonObject = new JSONObject(json);
jsonObject.put("followers", jsonObject.optString("followers"));

// org.json 20180813
String s = XML.toString(jsonObject);
System.out.println(XML.unescape(s));


Question supplémentaire: p >

Que faire si je ne veux pas d'options en tant qu'élément xml et que cela devrait faire partie de json?

<followers><options>{"key1":"a","key2":"b"}</options></followers><user>gerry</user><likes>[1,2,4]</likes>

résultat :

String json = "{\n" +
        "   \"user\": \"gerry\",\n" +
        "   \"likes\": [1, 2, 4],\n" +
        "   \"followers\": {\n" +
        "      \"options\": {\n" +
        "        \"key1\": \"a\",\n" +
        "        \"key2\": \"b\"\n" +
        "      }        \n" +
        "   }\n" +
        "}";

JSONObject jsonObject = new JSONObject(json);
JSONObject followers = jsonObject.getJSONObject("followers");

String options = followers.optString("options");
followers.put("options", options);

String s = XML.toString(jsonObject);
System.out.println(XML.unescape(s));


4 commentaires

Merci pour votre réponse. Je ne parviens pas à trouver unescape () sur XML mais nous pouvons y parvenir avec StringEscapeUtils.unescapeXml (s)


Lorsque j'essaye de convertir ce xml en json en utilisant JSONObject obj = XML.toJSONObject (s), \ sera imprimé dans la chaîne d'options. Comment puis-je surmonter cela? Également dans la solution ci-dessus donnée par vous, que faire si je ne veux pas d'options en tant qu'élément xml et que cela devrait faire partie de json?


@PratikRawlekar Je l'ai testé, mais \ n'a pas été imprimé. J'ai utilisé la version org.json 20180813 .


Ma version actuelle est 20150729 mais j'ai également essayé avec la version 20180813 mise à jour. Toujours confronté au même problème lorsque je le convertis en json à partir de xml.



0
votes

La bibliothèque Underscore-java a des méthodes statiques U.fromJson (json) et U.toXml (carte) . Vous pouvez modifier la carte et générer du xml. Je suis le mainteneur du projet.

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <id>9568</id>
  <name>Customer Analysis</name>
  <group>demo</group>
  <param>
    <globalSettings>{
  "showLegends": false,
  "legendPosition": "bottom center"
}</globalSettings>
  </param>
</root>

Résultat:

    Map<String, Object> map = U.fromJsonMap("{\"id\":\"9568\",\"name\":\"Customer Analysis\",\"group\":\"demo\",\"param\":{\"globalSettings\":{\"showLegends\":false,\"legendPosition\":\"bottom center\"}}}");
    U.set(map, "param.globalSettings", U.toJson((Map<String, Object>) U.get(map, "param.globalSettings")));
    System.out.println(U.toXml(map));


0 commentaires