2017-02-20 1 views
1

Ich habe das folgende Dokument in einer Testsammlung genannt:VelocyPack VPackParser null zurück _key von toJson Methode

[ 
    { 
    "_key": "2469", 
    "_id": "test/2469", 
    "_rev": "_Ujegqfu---", 
    "fieldName": "some value" 
    } 
] 

Ich Abrufen dies mit den folgenden zwei Methoden:

public Result helloWorldJson() { 

    ArangoDB db = new ArangoDB.Builder().user("<user>").password("<pass>").build(); 
    VPackParser parser = new VPackParser() ; 

    VPackSlice slice = db.db("<db>").collection("test").getDocument("2469", VPackSlice.class);  
    String json = db.db("cms").collection("test").getDocument("2469", String.class); 

    return Results.text().render("{velocy: " + parser.toJson(slice, true) + ", json: " + json); 
} 

Welche dies erzeugt Ausgang:

{velocy: {"_key":"2469","_id":null,"_rev":"_Ujegqfu---","fieldName":"some value"}, json: {"_key":"2469","_id":"test\/2469","_rev":"_Ujegqfu---","fieldName":"some value"} 

Lässt die VPackParser die _id null auf Zweck oder verpasse ich etwas?

Antwort

2

Das _id Feld in gespeicherte Dokumente aus einem speziellen velocypack Typ ist, der von Json nicht unterstützt wird und inlcudes die Sammlung Nummer, wird das Dokument in gespeichert. richtig, um dieses Feld in der für Menschen lesbaren „-Kollektion-name deserialisieren/document-key "Der Deserialisierungsprozess muss den Sammlungsnamen der angegebenen Sammlungs-ID kennen. Dies ist nur möglich, wenn der Prozess die Datenbank oder den internen Collection-Cache des Java-Treibers aufrufen kann. Nur wenn Sie getDocument (String, Type) oder eine andere API-Methode aufrufen, hat der Deserialisierungsprozess Zugriff darauf. VPackParser ist ein eigenständiges Velocypack < -> Json-Parser, der das Feld _id nicht auflösen kann.

String json = db.db("cms").collection("test").getDocument("2469", String.class); 

Wie in Ihrem Anruf, wenn Sie type auf String setzen Sie die Methode toJson() auf einer Instanz von VPackParser verwendet wird, die der Zugang zum dabase hat und die Sammel-Cache und so richtig das Feld desialize können _id, wenn das Parsen Velocypack zu Json.

Wenn Sie eine Velocypack getrennt von einem API-Aufruf deserialisieren mögen (mit korrekter Auflösung von _id) können Sie die Klasse verwenden können ArangoUtil die Sie aus dem Verfahren erhalten util() auf ArangoDB, ArangoDatabase oder ArangoCollection.

VPackSlice slice = db.db("<db>").collection("test").getDocument("2469", VPackSlice.class); 
String json = db.util().deserialize(slice, String.class); 
+0

Danke. Nutzt der Fahrer Velocy, um unabhängig von der Deserialisierung zu transportieren? –

+0

Ja. Alles wird zu/von Velocypack serialisiert/deserialisiert und mit dem Binärprotokoll Velocystream transportiert. – mpv1989