2016-12-20 1 views
0

Am mit Java 1.7, Resteasy und Codehaus Version von Jackson (für JSON Parsen) ...Zurück Jackson basierend JSON ist das Hinzufügen zusätzliche Schrägstriche in Nutzlast

einen Standard-Java-POJO DTO haben, die einen Verzeichnispfad auffüllt (als ein String), basierend auf einem Windows 7-Dateisystem:

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 
} 

Dies ist die Schicht, die meine Geschäftslogik auftritt ... es den Wert von einer Einheit aus einer Datenbank erhält und setzt die Eigenschaft in der 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; 
    } 
} 

Aus meiner log.debug() nennt es wie folgt aussieht (was der richtige String ist, dass ich will):

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

Hier ist der RESTful Web Service Aufruf:

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

Die tatsächliche JSON Nutzlast erzeugt aus dem RESTful Web Service Aufruf sieht wie folgt aus:

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

Warum ist es Hinzufügen eines zusätzlichen Schrägstriche?

Mein 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> 

die Apache Commons Bibliothek wie diese versucht, mit (im DirectoryRepository.getDirectoryById(Long id)-Methode):

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

Die einzige, die nicht die zusätzlichen Schrägstriche enthält ist (aber ich brauche das für die Windows-Konvention):

FilenameUtils.separatorsToUnix(); 

Auch versucht mit @JS onRawValue in meiner eigentlichen Klasse Web-Service:

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

Dieser brach tatsächlich eine Menge Dinge ...

sind die neu hinzugefügte ein Ergebnis in der Web-Services-Schicht oder Repository-Schicht schlitzt?

Wie kann ich es Windows-spezifischer machen?

Was ich meine JSON Nutzlast aussehen soll, ist dies:

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

Danke, dass Sie sich die Zeit nehmen, diese zu lesen ...

Antwort

5

Aufkantung \ ist Sonderzeichen in JSON format und es sollte sein entkam.

enter image description here

sonst in Ihrem Beispiel "\\my-network-folder\backupDir"\\ werden als einzelne Reverse Solidus und \b als Backspace interpretiert werden. Also macht Jackson alles richtig, versuch nicht, es zu reparieren.

0

Warum werden zusätzliche Schrägstriche hinzugefügt?

Sie erhalten doppelte Backslashes, da der Backslash in JSON an escape character ist.

Was ich meine JSON Nutzlast aussehen soll, ist dies:

{ "id": 1, "backup-dir": "my-Netzwerk-Ordner \ backupDir \"}

das ist kein gültiger JSON. Wenn der Aufrufer des Endpunkts Ihre Nutzlast deserialisiert, müssen sie den ausgeblendeten Backslash korrekt analysieren. Um einen umgekehrten Schrägstrich innerhalb von JSON zu übertragen, muss es maskiert werden. Es passiert einfach, dass das Escape-Zeichen auch ein umgekehrter Schrägstrich ist.

Verwandte Themen