返回基于杰克逊的JSON正在有效载荷

时间:2016-12-20 09:13:41

标签: java rest jackson java-7 resteasy

使用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
}

这是我的业务逻辑发生的层...它从数据库中获取实体的值并在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;
    }
}

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

Entity.getBackupDir: "\\my-network-folder\backupDir"
dto.getBackupDirectory: \\my-network-folder\backupDir"

这是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;
    }
}

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

{"id": 1, "backup-dir": "\\\\my-network-folder\\backupDir"}

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

我的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>

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

dto.setBackupDir(FilenameUtils.separatorsToUnix(entity.getBackupDirectory()));
dto.setBackupDir(FilenameUtils.separatorsToSystem(entity.getBackDirectory()));
dto.setBackupDir(FilenameUtils.separatorsToWindows(entity.getBackDirectory()));

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

FilenameUtils.separatorsToUnix();

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

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

这实际上打破了很多事情......

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

如何使其更具特定于Windows?

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

{"id": 1, "backup-dir": "\\my-network-folder\backupDir"}

感谢您抽出宝贵时间阅读此内容......

2 个答案:

答案 0 :(得分:6)

反斜杠\JSON format中的特殊字符,应该进行转义。

enter image description here

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

答案 1 :(得分:0)

  

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

您正在获取双反斜杠,因为在JSON中,反斜杠为an escape character

  

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

     
    

{&#34; id&#34;:1,&#34; backup-dir&#34;:&#34; \ my-network-folder \ backupDir&#34;}

  

这是无效的JSON。相反,当端点的调用者反序列化您的有效负载时,他们将需要正确解析转义的反斜杠。为了在JSON中传输反斜杠,必须对其进行转义。碰巧转义字符也是反斜杠。