Comment éviter que Jackson échappe des guillemets doubles en Java

Oct 22 2020

Je travaille sur un projet et je voulais réécrire du code écrit en Gson pour Jackson. J'essaie donc de créer une chaîne Json en utilisant certaines propriétés comme ci-dessous:

ObjectMapper objectMapper = new ObjectMapper();
ObjectNode objNode= objectMapper.createObjectNode();
objNode.put("identifierVal", UUID.randomUUID().toString());
objNode.put("version", "two");
List<String> namesList= new ArrayList<>();
namesList.add("test");
objNode.put("namesList", namesList.toString());
String requestObject = objectMapper.writeValueAsString(objNode.toString());

Et ce que j'attends de la sortie

{
   "identifierVal":1234,
   "version":"two",
   "namesList":[
      "test"
   ]
}

mais le résultat réel est:

"{  
        "\identifierVal\": 1234,   
        "\version\":"\two\",
"\namesList\": ["\test\"]

    }"

Donc, une fois que j'ai créé une chaîne Json à l'aide de jackson, il s'avère qu'il échappe les guillemets doubles pour les noms et les valeurs de propriété et ajoute un guillemet double au début et à la fin. Donc, à cause de cela, il échoue lors de l'appel d'un service.

J'ai parcouru de la documentation et je peux comprendre que Jackson échappe des guillemets doubles. Mais existe-t-il un moyen d'éviter d'échapper des guillemets doubles et d'ajouter des guillemets doubles de début et de fin.

Toute aide est appréciée. BTW, je suis passé par ces liens et à la recherche d'une solution appropriée et meilleure.

Pourquoi ObjectNode ajoute une barre oblique inverse dans Json String

Jackson ajoute une barre oblique inverse dans json

Réponses

4 DavidConrad Oct 22 2020 at 20:58

Le problème est que vous convertissez votre objet JSON en String via sa toString()méthode avant de le transmettre au objectMapper. Change ça:

String requestObject = objectMapper.writeValueAsString(objNode.toString());

pour ça:

String requestObject = objectMapper.writeValueAsString(objNode);

Vous devez également changer cela:

List<String> namesList= new ArrayList<>();
namesList.add("test");
objNode.put("namesList", namesList.toString());

pour ça:

ArrayNode namesNode = objNode.arrayNode();
namesNode.add("test");
objNode.set("namesList", namesNode);

et cela fonctionnera comme prévu.