2010-12-05 14 views
3

Ich versuche, die Konfiguration für Voldemort Schlüssel-Wert-Speicher einzurichten. Nun möchte ich in der Lage sein, beliebige Hashmaps zu speichern, aber ich habe den Weg dazu nicht gefunden (oder wenn es möglich ist).JSON Serializer für beliebige HashMaps in Voldemort

Gemäß der Dokumentation soll ich diese Syntax verwenden:

{"fname":"string", "lname":"string", "id":"int32", "emails":["string"]} 

Um anzuzeigen, dass ich eine HashMap Darstellung einer Java Bean speichern möchten, aber mit Einschränkungen erlaubt Tasten (nur fname, lname, id und emails) und ihre Typen.

Was ich müsste in der Lage sein, eine beliebige Karte wie folgt zu speichern:

{"name":"fred", "id":15} 

oder so:

{"apples":"50$", "oranges":"15€"} 

(Map Werte sind bedeutungslos, nur eine Darstellung von Karten mit verschiedene Schlüsselnamen und Werttypen)

Gibt es eine Möglichkeit, ein Schema zu definieren, das eine beliebige hashmap akzeptiert?

Antwort

3

Was ich nützlich gefunden habe, ist nur generische rohe Speicher (wo Byte [] übergeben wird), und Pre-Serialisierung Dinge auf der Client-Seite. Dies ist trivial (I Jackson verwenden) zu verwenden:

ObjectMapper mapper = new ObjectMapper(); 
    // to store: 
    byte[] data = mapper.writeValueAsBytes(myMap); 
    // and when retrieving back: 
    Map<String,Object> data = mapper.readValue(data, Map.class); 

Während Voldemort seine nicht unterstützt „JSON-like“ Speicher (es ist nicht JSON aber einfacher binärer Wörterbücher, soweit ich weiß), gibt es nicht viel Nutzen Sie es meiner Meinung nach, da Sie es nicht abfragen oder Teilmengen des Dokuments anfordern können.

+0

Dies scheint ziemlich einfach. Nur um sicher zu gehen - dieses 'Byte []' ist eine JSON-String-Repräsentation, kein serialisiertes Java-Objekt, oder? –

+0

Wir verwenden wahrscheinlich verschiedene Versionen von Jackson. In 1.6.3 gibt 'writeValueAsString' eine' String' zurück und 'readValue' für' byte [] 'hat einige zusätzliche Parameter. Wie auch immer, ich habe es versucht und es funktioniert wie ein Zauber! Danke .. –

+0

Ah, mein Schlechter - es sollte stattdessen "writeValueAsBytes()" sein. Freut mich zu hören, dass es funktioniert; Dies ist ein häufiger Anwendungsfall, obwohl ich ihn noch nicht mit V verwendet habe. – StaxMan

Verwandte Themen