2015-01-12 66 views
1

我嘗試使用@JsonProperty註釋序列化包含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 -class的序列化信息,只有反序列化信息。

下應該制定出適合你:

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註釋的方法 - e.g這樣的:

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

或者,另一種方法是把註釋實際領域。這不是我會推薦的,因爲它有點魔術

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

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

我個人偏好:

  • 該註釋被放置在方法
  • 該對象是不可改變的(如果可能)
  • 和適當@JsonCreator -method加入(構造函數爲你的類工作,但爲了創建更復雜的對象結構@JsonCreator將幫助你)。
+0

好,它似乎做的工作:)我還有一個問題,雖然:似乎映射的鍵被序列化爲字符串,而不是長期,有沒有辦法強制鍵序列化爲長? – user2512231

+1

@ user2512231那麼,JSON鍵總是字符串。否則,它不是有效的JSON。但是,這些值可能是數字,字符串,數組或其他JSON對象。 – wassgren

+0

明白了,謝謝! – user2512231

相關問題