2015-01-12 2 views
1

주석을 사용하여 Map을 포함하는 객체를 직렬화하려고 시도했지만 테스트했을 때지도의 키만 직렬화되는 것을 보았습니다. 나는 그것을 찾았지만 아무런 해결책도 찾지 못했다. 내가 뭘 잘못하고 있니?@JsonProperty를 사용하여지도를 일련 화하기

public class People { 
    private final Map<Long,String> idToNameMap; 

    public People(@JsonProperty("idToNameMap") final Map<Long,String> idToNameMap) { 
     this.idToNameMap = idToNameMap; 
    } 
} 


public class PeopleTest { 

    private static final long ID_1 = 111l; 
    private static final long ID_2 = 222l; 
    private static final String NAME_1 = "name1"; 
    private static final String NAME_2 = "name2"; 

    private final ObjectMapper mapper = new ObjectMapper(); 

    @Test 
    public void testFromAndToJSON() throws Exception { 
     Map<Long,String> idToNameMap = Maps.newHashMap(); 
     idToNameMap.put(ID_1,NAME_1); 
     idToNameMap.put(ID_2,NAME_2); 
     mapper.writeValueAsString(new People(idToNameMap)); 
    } 
} 

답변

3

당신은 People - 클래스 만 직렬화 정보에 대한 직렬화 정보를 제공하지 않았습니다.

다음은 당신을 위해 해결해야

public class People { 
    private final Map<Long, String> idToNameMap; 

    // The constructor works for deserialization and has nothing to do with serialization 
    public People(@JsonProperty("idToNameMap") final Map<Long, String> idToNameMap) { 
     this.idToNameMap = idToNameMap; 
    } 

    // Getters are typically automatically serialized 
    public Map<Long, String> getIdToNameMap() { 
     return idToNameMap; 
    } 
} 

직렬화 정보를 제공하기 위해 여러 가지 방법이 있습니다.

@JsonProperty("idToNameMap") 
public Map<Long, String> getMapping() { 
    return idToNameMap; 
} 

또는 다른 방법은 실제 현장에 주석을 배치하는 것입니다 :이 같은 예 : - 또 다른 방법은 방법에 대한 @JsonProperty 주석을 사용하는 것입니다. 이것은 약간 마술이기 때문에 나는 추천할만한 것이 아니다.

public class People { 
    @JsonProperty("idToNameMap") 
    private final Map<Long, String> idToNameMap; 

    public People(@JsonProperty("idToNameMap") final Map<Long, String> idToNameMap) { 
     this.idToNameMap = idToNameMap; 
    } 
} 

I 개인적 선호 :

  • 주석이 가능한 경우
  • 및 (적절한 @JsonCreator -method 첨가되는 오브젝트는 불변하는 방법에
  • 배치되어 있음 귀하의 클래스에 대한 생성자 작업하지만보다 복잡한 객체 구조를 만들려면 @JsonCreator 당신을 도울 것입니다).
+0

위대한, 그것은 할 것 같다 :) 나는 한 가지 더 질문이 있습니다 :지도의 키가 문자열로, 그리고 Longs로 직렬화 된 것 같습니다. Longs 키 직렬화를 강제하는 방법이 있습니까? – user2512231

+1

@ user2512231 글쎄, JSON 키는 항상 문자열입니다. 그렇지 않으면 유효한 JSON이 아닙니다. 그러나 값은 숫자, 문자열, 배열 또는 기타 JSON 객체 일 수 있습니다. – wassgren

+0

감사합니다. – user2512231

관련 문제