jpganz18
jpganz18

Reputation: 5858

How can I introduce escape characters to my JSON mapper?

I am trying to make a simple thing using com.fasterxml.jackson.databind.ObjectMapper.

I have an object I want to translate to String.

class Car{
  String color;
  String brand;

  //... more class info
}

It is working fine and I get my String as it should but the result looks like this:

{"color: "blue", "brand": "toyota" }

Is it possible to make it look like:

{\"color\": \"blue\", \"brand\", \"toyota\" }

I'm not sure if this breaks the JSON expected format.

I've read the docs and seems like I can use this:

ObjectMapper().factory.setCharacterEscapes(...)

But I'm not sure how to pass it or from which repo. Any ideas?

Upvotes: 1

Views: 15565

Answers (3)

Paraskevas Ntsounos
Paraskevas Ntsounos

Reputation: 1777

I think that you can use something like JSONObject.quote(json):

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(new Car("blue", "Toyota"));
System.out.println(JSONObject.quote(json));

Output:

"{\"color\": \"blue\", \"brand\", \"toyota\" }"

Upvotes: 0

dnault
dnault

Reputation: 8889

I am basically trying to make a mapper for an sort of inner object to match a SNS format https://docs.aws.amazon.com/sns/latest/dg/sns-send-custom-platform-specific-payloads-mobile-devices.html

Here's one of the examples from that page:

{
  "GCM":"{\"data\":{\"message\":\"Check out these awesome deals!\",\"url\":\"www.amazon.com\"}}"
}

That's a JSON object with a single field named "GCM" whose value is a string. The content of the string is another JSON object.

Let's take your Car class as an example, and assume you want to generate this JSON as your output:

{
  "car": "{\"color\": \"blue\", \"brand\": \"toyota\"}"
}

First you'll need to convert your Car object to a JSON string. Then you create another JSON object and stuff the car's JSON string into a field of this outer object:

String carJson = objectMapper.writeValueAsString(myCar);
Map<String, Object> outerObject = singletonMap("car", carJson);
String finalResult = objectMapper.writeValueAsString(outerObject);

Upvotes: 1

Michał Ziober
Michał Ziober

Reputation: 38645

Use Jackson to generate valid JSON payload and StringEscapeUtils to escape it.

Example code:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.text.StringEscapeUtils;

public class EscapeJsonApp {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(new Car("blue", "Toyota"));
        String escapedJson = StringEscapeUtils.escapeJson(json);
        System.out.println(escapedJson);
    }
}

class Car {
    String color;
    String brand;

    // getters, setters, constructor
}

Above code prints:

{\"color\":\"blue\",\"brand\":\"Toyota\"}

Maven dependency:

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-text</artifactId>
  <version>1.8</version>
</dependency>

Upvotes: 4

Related Questions