Gson с радостью сделает JSON с помощью List> но не если список находится в классе - PullRequest
1 голос
/ 07 апреля 2019

Как и многие другие до меня, мне нужно составить «таблицу» пар ключ-значение. Там может быть много разных, и мне не нужно сортировать. Список пар казался хорошим выбором, но теперь я не могу заставить GSon правильно создать JSON для класса, который их содержит.

Я мог бы искать другие пути, но теперь мое любопытство задето.

Нет проблем получить JSON за List<Pair<String, String>>

@Test
void listOfPairs() {
    List<Pair<String, String>> pairs = new ArrayList<>();

    pairs.add(new ImmutablePair<>("Test1", "Has Value1"));
    pairs.add(new ImmutablePair<>("Test1", "Has Value2"));
    pairs.add(new ImmutablePair<>("Test2", "Has Value2"));

    String json = new GsonBuilder().setPrettyPrinting().create().toJson(pairs);
    System.out.println(json);
}

Запуск этого «теста» предоставляет красивый пышный объект JSON:

[
   {
      "left": "Test1",
      "right": "Has Value1"
   },
   {
      "left": "Test1",
      "right": "Has Value2"
   },
   {
      "left": "Test2",
      "right": "Has Value2"
  }
]

Но когда List<Pair<String, String>> является членом класса, это не так уж и много.

class Thing {
    private List<Pair<String, String>> pairs = new ArrayList<>();
    private String thingName = "Benjamin Jacob Grimm";

    Thing() {
        pairs.add(new ImmutablePair<>("One", "1"));
        pairs.add(new MutablePair<>("Two", "1"));
        pairs.add(new ImmutablePair<>("Two", "2"));
    }
}

@Test
void thingTest() {
    Thing thing = new Thing();
    String json = new GsonBuilder().setPrettyPrinting().create().toJson(thing);
    System.out.println(json);
}

Теперь ответ совершенно не пышный! :

{
  "pairs": [
       {},
       {},
       {}
  ],
  "thingName": "Benjamin Jacob Grimm"
}

Опять же, я мог бы искать другой механизм хранения, но мне наверняка любопытно, что здесь не так. У кого-нибудь есть мысли?

1 Ответ

1 голос
/ 07 апреля 2019

Попробуйте предоставить TypeToken для toJson, что-то вроде:

Type type = new TypeToken<Pair<String, String>>() {}.getType();

String json = new GsonBuilder().setPrettyPrinting().create().toJson(pairs, type);
System.out.println(json);

Не проверял:)

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