2015-08-21 3 views
3

Следующие предложения в Using Enums while parsing JSON with GSON, я пытаюсь сериализовать карту, ключи которой являются enum с использованием Gson.Сериализация карты перечислений с помощью 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(); 
Смежные вопросы