使用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"}
感谢您抽出宝贵时间阅读此内容......
答案 0 :(得分:6)
反斜杠\
是JSON format中的特殊字符,应该进行转义。
否则,在您的示例中,"\\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中传输反斜杠,必须对其进行转义。碰巧转义字符也是反斜杠。