У меня проблемы, когда я пытаюсь десериализовать одну строку Json с помощью Gson. Строка идет примерно так
(Примечание: я просто упростил это, но оставив ту часть, с которой у меня возникли проблемы, и из-за этого могут быть ошибки синтаксиса Json, но я проверил с помощью онлайн-валидатора, что строка, с которой я работаю, в порядке):
// let's call this "container" json element
{
"context": "context",
"cpuUsage": cpuUsageValue,
"name": "thename",
"rates": {
"definition": [
{
"key": "name",
"type": "string"
},
{
"key": "rate",
"type": "double"
}
]
"rows": [
{
"name": "thename1",
"rate": therate
},
{
"name": "thename2",
"rate": therate2
}
]
}
Теперь проблема, которую я получаю, заключается в том, что я пытаюсь десериализовать массивы json («определение» и «строки»). Остальные поля получают правильные значения при десериализации.
Я использую следующее определение класса (для простоты нет методов получения / установки):
public class Container
{
private String context;
private Double cpuUsage;
private String name;
private RateContainer rates;
public Container()
{
}
}
RateContainer (внутренний статический класс для класса Container, согласно спецификации Gson):
public static class RateContainer
{
private List<DefinitionContainer> definition;
private List<RowsContainer> rows;
public static class DefinitionContainer
{
String key;
String type;
public DefinitionContainer()
{
}
}
public static class RowsContainer
{
String name;
Double rate;
public RowsContainer()
{
}
}
public RateContainer()
{
}
}
Для разбора строки Json я использую:
Container container = gson.fromJson(containerString, Container.class);
и я получаю следующее исключение:
Expecting object found: [{"key":"name","type":"string"},{"key":"rate","type":"double"}]
Похоже, в определении класса должно быть что-то, что не работает должным образом. Я проверил Gson API и знаю, что для десериализации списков обычно нужно сделать следующее:
Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();
Collection<Integer> ints2 = gson.fromJson(json, collectionType);
поэтому я подумал, что, возможно, сначала смогу получить эти массивы, используя что-то вроде:
JsonElement element = containerJsonElement.getAsJsonObject().get("rates");
и затем получить «определение» и «строки», но я бы предпочел оставить все в объекте «Контейнер».
Есть ли способ десериализации этих списков таким образом?
Что-то не так в определении класса?
Спасибо всем заранее!