返回基于杰克逊的JSON正在有效载荷中添加额外的斜杠

Pac*_*ver 0 java rest resteasy jackson java-7

我使用的是Java 1.7,RestEasy和Jackson的codehaus版本(用于JSON解析)......

有一个标准的Java POJO DTO,它基于Windows 7文件系统填充目录路径(作为String):

import org.codehaus.jackson.annotate.JsonProperty;

public class BackupDirDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonProperty("id")
    private Long id;

    @JsonProperty("backup-dir")
    private String backupDir;

    // Getters & Setters
}
Run Code Online (Sandbox Code Playgroud)

这是我的业务逻辑发生的层...它从数据库中获取实体的值并在DTO中设置属性:

public class DirectoryRepository {

    public BackupDirDTO getDirectoryById(Long id) throws Exception {
        DirectoryEntity entity = directoryRespository.getEntityById(id);
        BackupDirDTO dto = new BackupDirDTO();
        log.debug("Entity.getBackupDir: " + enity.getBackupDirectory());
        dto.setBackupDir(entity.getBackupDirectory());
        log.debug("dto.getBackupDirectory: " + dto.getBackupDir());
        return dto;
    }
}
Run Code Online (Sandbox Code Playgroud)

从我的log.debug()调用它看起来像这样(这是我想要的正确的字符串):

Entity.getBackupDir: "\\my-network-folder\backupDir"
dto.getBackupDirectory: \\my-network-folder\backupDir"
Run Code Online (Sandbox Code Playgroud)

这是RESTful Web服务调用:

public class DirectoryResource {

    private DirectoryRepository repository;

    @GET
    @Path("/directories/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public BackupDirDTO getDirectoryById(@PathParam("id") Long id) {
        BackupDirDTO dto = new BackupDirDTO();
        try {
            dto = repository.getDirectoryById(id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dto;
    }
}
Run Code Online (Sandbox Code Playgroud)

从RESTful Web Service调用生成的实际JSON有效负载如下所示:

{"id": 1, "backup-dir": "\\\\my-network-folder\\backupDir"}
Run Code Online (Sandbox Code Playgroud)

为什么要添加额外的斜杠?

我的pom.xml

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jackson-provider</artifactId>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jackson-provider</artifactId>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxrs</artifactId>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.jboss.spec.javax.ws.rs</groupId>
    <artifactId>jboss-jaxrs-api_1.1_spec</artifactId>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxb-provider</artifactId>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jdk-http</artifactId>
    <version>2.3.10.Final</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-client</artifactId>
    <version>3.0.10.Final</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.jboss.spec.javax.servlet</groupId>
    <artifactId>jboss-servlet-api_3.0_spec</artifactId>
    <scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

尝试使用这样的Apache Commons库(在DirectoryRepository.getDirectoryById(Long id)方法内):

dto.setBackupDir(FilenameUtils.separatorsToUnix(entity.getBackupDirectory()));
dto.setBackupDir(FilenameUtils.separatorsToSystem(entity.getBackDirectory()));
dto.setBackupDir(FilenameUtils.separatorsToWindows(entity.getBackDirectory()));
Run Code Online (Sandbox Code Playgroud)

唯一一个不包含额外斜杠的是(但我需要一个用于Windows约定):

FilenameUtils.separatorsToUnix();
Run Code Online (Sandbox Code Playgroud)

甚至尝试在我的实际Web服务类中使用@JSonRawValue:

@JsonRawValue
@JsonProperty("backup-dir")
private String backupDir;
Run Code Online (Sandbox Code Playgroud)

这实际上打破了很多东西......

新添加的斜杠是Web服务层或存储库层中的结果吗?

如何使其更具特定于Windows?

我希望我的JSON有效负载看起来像这样:

{"id": 1, "backup-dir": "\\my-network-folder\backupDir"}
Run Code Online (Sandbox Code Playgroud)

感谢您抽出时间来阅读...

And*_*niy 6

反斜杠\JSON格式的特殊字符,应该进行转义.

在此输入图像描述

否则在您的示例"\\my-network-folder\backupDir" \\中将被解释为单反向固相和\b退格.所以杰克逊正在做正确的事情,不要试图解决它.