Создайте обратную косую черту JSON с помощью библиотеки Jackson

#java #json #jackson #backslash

#java #json #джексон #обратная косая черта

Вопрос:

В классе Java есть поле

     String cardExpiration = "1022"; //I can format it as needed
  

Используя Jackson libray, мне нужно создать следующий JSON:

 {
  "cardExpiration":"10/22"
}
  

Я использую следующий код

         String cardExpiration = "10\/22";
        MyPojo myPojo = new MyPojo(cardExpiration);
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(myPojo);
  

Этот код возвращает JSON с «10 / 22» (двойные обратные косые черты, но мне нужна только одна обратная косая черта).
Я не могу создать в Java строку «10 / 22», так как это недопустимый escape-символ в строковом литерале.
Есть идеи, как получить в JSON «10 / 22»?

Комментарии:

1. Ваш код уже выполняет правильные действия. Визуальное представление "10/22" в вашей IDE просто есть "10\/22" . Но она по-прежнему содержит только одну фактическую обратную косую черту

2. Если я выведу результирующую строку JSON на консоль, у нее будет две обратные косые черты. Я не думаю, что это визуальное представление.

Ответ №1:

Замените обратную косую черту второй, чтобы определить ее как строку.

 String cardExpiration = "10\/22";
System.out.println(cardExpiration); // prints 10/22
  

Вот рабочий пример, который включает использование Jackson для сериализации вашего POJO. Обратите внимание, что Джексон избегает обратной косой черты внутри JSON auto. для вас. Если вы действительно хотите иметь значение JSON {"cardExpiration":10/22} , вы можете добавить к атрибуту в POJO аннотацию @JsonRawValue.

pom.xml

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.2</version>
        </dependency>
    </dependencies>
</project>
  

App.java

 import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class App {

    public static void main(String[] args) throws JsonProcessingException {
        String cardExpiration = "10\/22";
        System.out.println(cardExpiration); // prints 10/22

        MyPojo myPojo = new MyPojo(cardExpiration);
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(myPojo);
        System.out.println(json); // prints {"cardExpiration":"10\/22"}
    }
    
}

class MyPojo {
    String cardExpiration;

    public MyPojo(String cardExpiration) {
        this.cardExpiration = cardExpiration;
    }

    public String getCardExpiration() {
        return cardExpiration;
    }

    public void setCardExpiration(String cardExpiration) {
        this.cardExpiration = cardExpiration;
    }
}
  

Комментарии:

1. Оливер Что мне нужно, так это то, System.out.println(json); что печатало бы не двойную обратную косую черту, а только одну обратную косую черту.

2. @Vladimir: В этом случае исходное значение, которое вы пытаетесь представить, вообще не имеет обратной косой черты, а просто «10/22». Зачем вам обратная косая черта в JSON? Прямые косые черты не обязательно экранировать в JSON.

3. Владимир проверьте мою правку — перейдите к добавлению @JsonRawValue к вашему атрибуту. Чем вы получите {«cardExpiration»: 10 / 22}

4. @Jon Skeet Это требование от клиента. Финансовые учреждения иногда используют очень странные форматы.

5. @Oliver: Ваш ответ помог, но все еще есть одна незначительная проблема. Если я использую «@JsonRawValue», то кавычек не будет. Целью было получить {«cardExpiration»: «10 / 22»}