Сериализация карты объектов с помощью gson - объект не завершен - PullRequest
0 голосов
/ 06 января 2019

Я хочу сериализовать объект Bar, который содержит примитивные типы и HashMap.

public class Bar{
 int simpleValue;
 HashMap<Foo,Integer> map;
...
}

public class Foo{
 ...
}

Я использую Gson для создания Json-String:

Gson gson = new Gson();
String json = gson.toJson(barObject);

В результате получается следующая строка:

{"simpleValue":9,"map":{"com.blabla.Foo@2d9b7da":120,...}}

Почему существует только строковое представление имени объекта?

Что я делаю не так?

gson.toJson(fooObject) печатает правильные свойства Foo ...

1 Ответ

0 голосов
/ 06 января 2019

Ваш код печатает строковое представление имени объекта, потому что класс Bar имеет объект Map с ключом в качестве класса, чей toString() не был переопределен.
gson использует реализацию toString() для генерации ключа json.
Так как вы не реализовали его, он возвращается к стандартному значению Object.toString() для генерации ключей. Отсюда вывод.

Ниже приведен источник, демонстрирующий поведение,

public class Bar {
    Map<Foo, Integer> map;
    public static void main(String[] args) {
        Gson g = new Gson();
        TracingAspect t = new Bar();
        t.map = new HashMap<>();
        t.map.put(new Foo("ff"), 5);
        String j = g.toJson(t);
        System.out.println(j);
    }

}
class Foo {
    String a;
    public Foo (String a) {this.a=a;}
    @Override
    public String toString () {
        return a;
    }
}

Вывод следующего:

{"map":{"ff":5}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...