Генерация JSON с коллекцией, представленной индексированными элементами - PullRequest
0 голосов
/ 18 октября 2018

Существует ли какая-либо библиотека, которая может генерировать объект JSON, в котором коллекция представлена ​​в виде набора пронумерованных элементов?

При использовании, например, библиотеки GSON и такого класса:

`class Bus {
    List<Pasenger> passengers;

    public Bus(List<Pasenger> passengers) {
        this.passengers = passengers;
    }
}`

GSON генерирует JSON следующим образом:

`{"bus":{
    "passengers":[
    {"name":"John","familiName":"Smith"},
    {"name":"Marry","familiName":"James"}
    ]
}}`

Но меня просят сгенерировать JSON, в котором коллекция представлена ​​элементами, каждый из которых имеет свой индекс.Например:

`{"bus":{
    "passengers[0]":{"name":"John","familiName":"Smith"},
    "passengers[1]":{"name":"Marry","familiName":"James"}
}}`

Я копался в GSON и FasterXML, но не смог найти поддержку для этой функции.Кто-нибудь знает, есть ли какая-нибудь библиотека, поддерживающая это?

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Я думаю, что вы можете создать карту вместо списка (если вы не хотите писать собственный сериализатор и десериализатор).И конструктор для Bus будет выглядеть так:

private Map<String, Pasenger> bus = new HashMap<>();

public Bus(List<Pasenger> passengers) {
      for (int i = 0; i < passengers.size(); i++){
           bus.put("passengers["+i+"]", passengers.get(i));
      }
}

Для простого pasenger только с именем это выглядит как

{"bus":
    {
      "passengers[0]":{"name":"first"},
      "passengers[1]":{"name":"second"}
    }
}
0 голосов
/ 18 октября 2018

Вы можете создать класс, который реализует JsonSerializer, чтобы указать, как вы хотите, чтобы он был сериализован.
И затем зарегистрируйте его при создании вашего Gson: Gson gson = new GsonBuilder (). RegisterTypeAdapter (Bus.class, new BusAdapter ()). create ();

Дополнительная информация: https://github.com/google/gson/blob/master/UserGuide.md#TOC-Writing-a-Serializer

...