2010-12-05 3 views
3

Voldemort 키 - 값 저장소에 대한 구성을 설정하려고합니다. 이제는 임의의 해시 맵을 저장할 수 있기를 원하지만 그렇게 할 수있는 방법을 찾지 못했습니다 (또는 가능한 경우).Voldemort의 임의 HashMaps 용 JSON 시리얼 화기

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

내가 자바 빈의 HashMap의 표현을 저장할 것을 나타냅니다 만 허용 키에 대한 제한 (만 fname, lname, id와 가진하려면 :

문서에 따르면 나는이 구문을 사용한다 emails) 및 그 유형. 내가 필요로하는 것이 무엇

같은 임의의 맵을 저장 할 수 있습니다 :

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

또는 같은

:

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

(지도 값,지도의 단지 그림 의미가 다른 키 이름 및 값 유형)

임의 해시 맵을 허용하는 스키마를 정의하는 방법이 있습니까?

답변

3

유용한 점은 generic raw storage (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 []'는 직렬화 된 Java 객체가 아니라 JSON 문자열 표현입니다. 맞습니까? –

+0

아마도 다른 버전의 Jackson을 사용하고있을 것입니다. 1.6.3에서'writeValueAsString'은'String'을 리턴하고,'byte []'를위한'readValue'는 몇 가지 여분의 매개 변수를 가지고 있습니다. 어쨌든, 당신의 접근 방식을 시도하고 그것은 매력처럼 작동합니다! 고마워 .. –

+0

아, 내 잘못 - 대신 "writeValueAsBytes()"해야합니다. 그것을 듣고 기쁘다 작동합니다; 비록 V와 함께 아직 사용하지는 않았지만 이것은 일반적인 사용 사례입니다. – StaxMan