2014-02-17 4 views
0

다음과 같이 (POJO에서 일련 번호가 지정된) 필자는 필드 이름에 따라 깊이 목록에 관계없이 각 항목의 목록을 암호화해야합니다. 예를 들어, 저장을 위해 문서의 특정 부분을 암호화하고 싶습니다 (password 및 quantityOrdered).Jackson - 일치하는 필드를 재귀 적으로 바꿉니다.

나는 암호화 된 조각을 가지고 있지만, JsonNode를 트래버스하는 좋은 접근 방법을 찾고, 일치하는 필드의 각 항목을 찾아 암호화/대체합니다.

(예 : @JsonIgnore를 통해 숨겨져 있어도 데이터를 저장해야하므로 문제가 해결되지 않습니다.) 이것은 일부 시스템 데이터의 오프라인 파일 백업을위한 것입니다.

일치하려는 필드 (passsword 및 quantityOrdered)의 유형과 유형이 다르며 암호가 여러 수준에서 여러 수준으로 나타납니다.

{ 
    "name":"foo", 
    "id":"123456", 
    "password":"bar", 
    "communities": [ 
    { 
     "name":"administrators", 
     "location":"xyz", 
     "password":"baz" 
    }, 
    { 
     "name":"members", 
     "location":"xyz", 
     "password":"baz" 
    } 
    ], 
    "quantityOrdered": 35 
} 

예 트리 모델을 사용하는 것은 문서의 구조에 대한 지식을 의미합니다. JsonNode.getElements()를 사용하여 이름의 모든 요소를 ​​가져올 수 있지만 키가 아닌 값만 반환한다는 것을 알았습니다. 이 경험이있는 사람은 좋은 접근 방법을 추천 할 수 있습니까?

+0

아마도 이러한 속성을'@JsonIgnore'로 표시하여 무시할 수 있습니다. – gadget

+0

^^ 그것. 필드를 직렬화하는 이유는 무엇입니까? –

+0

위의 의견은 본인의 의도에 다소 모호한 본래의 질문과 더 관련이 있습니다. 난 필드와 값을 (가역적으로 암호화 된 형식으로) 저장해야합니다 – rogodeter

답변

0

사용자 정의 JsonFilter를 사용하여 serializeAsField 메소드를 덮어 쓸 수 있습니다.

@Override 
public void serializeAsField(Object bean, JsonGenerator jgen, SerializerProvider prov, BeanPropertyWriter writer) throws Exception { 
    if (writer.getName().equals("name")) { 
     // encrypt the value 
    } else { 
     // The property will not be filtered 
     writer.serializeAsField(bean, jgen, prov); 
    } 
}