Cómo evitar que Jackson se escape de las comillas dobles en Java

Oct 22 2020

Estoy trabajando en un proyecto y quería reescribir un código escrito en Gson para Jackson. Así que estoy tratando de crear una cadena Json usando algunas propiedades como se muestra a continuación:

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());

Y lo que espero que sea la salida

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

pero el resultado real es:

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

    }"

Entonces, una vez que creo una cadena Json usando jackson, resulta que está escapando de las comillas dobles para los nombres y valores de las propiedades y agregando una comilla doble al principio y al final. Entonces, debido a esto, está fallando al llamar a un servicio.

He revisado algo de documentación y puedo entender que Jackson se escapa de las comillas dobles. Pero, ¿hay alguna manera de evitar escapar de las comillas dobles y agregar comillas dobles iniciales y finales?

Se agradece cualquier ayuda. Por cierto, revisé estos enlaces y busqué una solución adecuada y mejor.

Por que ObjectNode agrega barra invertida en Json String

Jackson agrega barra invertida en json

Respuestas

4 DavidConrad Oct 22 2020 at 20:58

El problema es que está convirtiendo su objeto JSON en un String a través de su toString()método antes de pasarlo al objectMapper. Cambia esto:

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

a esto:

String requestObject = objectMapper.writeValueAsString(objNode);

También necesita cambiar esto:

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

a esto:

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

y funcionará como esperas.