Как я могу ввести escape-символы для моего JSON mapper? - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь сделать простую вещь, используя com.fasterxml.jackson.databind.ObjectMapper.

У меня есть объект, который я хочу перевести на String.

class Car{
  String color;
  String brand;

  //... more class info
}

Он работает нормально, и я получить мой String как следует, но результат выглядит так:

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

Можно ли сделать так, чтобы он выглядел так:

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

Я не уверен, что это сломается JSON ожидаемый формат.

Я прочитал документы и похоже, что я могу использовать это:

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

Но я не уверен, как его передать или из какого репо , Есть идеи?

Ответы [ 2 ]

1 голос
/ 22 января 2020

Я в основном пытаюсь сделать картограф для своего рода внутреннего объекта, соответствующего формату SNS https://docs.aws.amazon.com/sns/latest/dg/sns-send-custom-platform-specific-payloads-mobile-devices.html

Вот один из примеров из этого page:

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

Это JSON объект с одним полем с именем "GCM", значением которого является строка. Содержимое строки - это еще один объект JSON.

Давайте возьмем в качестве примера ваш класс Car и предположим, что вы хотите сгенерировать этот JSON в качестве вывода:

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

Сначала вам нужно преобразовать ваш Car объект в JSON строку. Затем вы создаете еще один объект JSON и вставляете строку JSON автомобиля в поле этого внешнего объекта:

String carJson = objectMapper.writeValueAsString(myCar);
Map<String, Object> outerObject = singletonMap("car", carJson);
String finalResult = objectMapper.writeValueAsString(outerObject);
1 голос
/ 22 января 2020

Используйте Jackson для генерации действительной JSON полезной нагрузки и StringEscapeUtils для ее выхода.

Пример кода:

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
}

Над кодом печатается:

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

Maven Зависимость :

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