почему два, казалось бы, идентичные хэш-карты имеют другое поведение при сериализации gson?
вход:
public static void main(String[] args) {
final String key = "some key";
final String value = "some value";
Map<String, String> map1 = new HashMap<String, String>(){{put(key, value);}};
System.out.println(new Gson().toJson(map1) + " " + map1.get(key));
Map<String, String> map2 = new HashMap<>();
map2.put(key, value);
System.out.println(new Gson().toJson(map2) + " " + map2.get(key));
}
выход:
null some value
{"some key":"some value"} some value
Process finished with exit code 0
Ответы
Ответ 1
Для map1
вы создали анонимный подкласс. Предполагая, что ваш класс, содержащий main()
, называется ExampleClass
, тогда:
System.out.println(map1.getClass().getName())
распечатывает:
ExampleClass$1
В то время как печать класса для map2
дает:
java.util.HashMap
Что касается точной причины, по которой Gson не сериализует ее, Gson использует имя класса для поиска конвертера. Если вы сериализуете его, используя:
System.out.println(new Gson().toJson(map1, HashMap.class));
... он работает так, как ожидалось.