gpt4 book ai didi

java - 返回的基于 Jackson 的 JSON 在有效负载中添加了额外的斜杠

转载 作者:行者123 更新时间:2023-12-01 07:49:27 25 4
gpt4 key购买 nike

我正在使用 Java 1.7、RestEasy 和 Codehaus 版本的 Jackson(用于 JSON 解析)...

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

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 服务调用生成的实际 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"}

感谢您花时间阅读本文...

最佳答案

反斜杠\JSON format中的特殊字符它应该被逃脱。

enter image description here

否则在您的示例中 "\\my-network-folder\backupDir" \\ 将被解释为单个反向斜线和 \b 作为退格键。所以 jackson 做的一切都是正确的,不要试图修复它。

关于java - 返回的基于 Jackson 的 JSON 在有效负载中添加了额外的斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41238570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com