2015-08-21 152 views
3

以下建議Using Enums while parsing JSON with GSON,我試圖序列化使用Gson的密鑰爲enum的映射。使用Gson自定義序列化序列化枚舉映射

考慮下面的類:

public class Main { 

    public enum Enum { @SerializedName("bar") foo } 

    private static Gson gson = new Gson(); 

    private static void printSerialized(Object o) { 
     System.out.println(gson.toJson(o)); 
    } 

    public static void main(String[] args) { 
     printSerialized(Enum.foo); // prints "bar" 

     List<Enum> list = Arrays.asList(Enum.foo); 
     printSerialized(list); // prints ["bar"] 

     Map<Enum, Boolean> map = new HashMap<>(); 
     map.put(Enum.foo, true); 
     printSerialized(map); // prints {"foo":true} 
    } 
} 

兩個問題:

  1. 爲什麼的printSerialized(map)打印{"foo":true}代替{"bar":true}
  2. 我怎樣才能打印{"bar":true}

回答

6

GSON用來Map鍵專用串行器。這在默認情況下使用即將用作鍵的對象的toString()。對於enum類型,基本上是enum常量的名稱。 @SerializedName,默認情況下爲enum類型,僅在將序列化爲enum作爲JSON值(除配對名稱以外)時纔會使用。

使用GsonBuilder#enableComplexMapKeySerialization來構建您的Gson實例。

private static Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();