2010-12-05 14 views
3

私はVoldemortのKey-Valueストアの設定を設定しようとしています。さて、私はそれに任意のハッシュマップを格納することができるようにしたいと思いますが、私はそうする方法を見つけていない(または可能な場合)。私はこの構文を使用する必要がある文書によるとVoldemortの任意のHashMaps用のJSONシリアライザ

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

私は、Java BeanのHashMapの表現を保存することを指示するのではなく、許可されたキーに制約を持つ(唯一fnamelnameidemails)およびそのタイプ。私は必要があるだろう何

は、このような任意のマップを保存することができることです。

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

またはこのような:

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

(地図値は、とマップの単なるイラスト無意味です異なるキー名、および値タイプ)

任意のハッシュマップを受け入れるスキーマを定義する方法はありますか?

答えて

3

私が有用であると分かったのは、汎用のrawストレージ(byte []が渡される)を使用し、クライアント側でプリシリアライズすることです。これは、(私がJacksonを使用)を使用するのは簡単です:

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

ヴォルデモートが(それは私の知る限り、JSONが、単純なバイナリの辞書ではありません)その「JSONのような」ストレージをサポートしていますが、多くはありません私の意見でそれを使用することに恩恵を受けます。なぜなら、あなたはそれに問い合わせることも、文書のサブセットを要求することもできないからです。

+0

これはかなり簡単です。この 'byte []'はJSON文字列表現であり、シリアル化されたJavaオブジェクトではありません。 –

+0

おそらく、異なるバージョンのJacksonを使用しています。 1.6.3では 'writeValueAsString'は' String'を返し、 'byte []'の 'readValue'はいくつかの余分なパラメータを持っています。とにかく、私はあなたのアプローチを試み、それは魅力のように動作します!ありがとう.. –

+0

ああ、私の悪い - 代わりに "writeValueAsBytes()"する必要があります。聞いてうれしいです。これは一般的な使用例ですが、私はまだV自身で使用していません。 – StaxMan

関連する問題