У меня есть JSON ниже:Пользовательские десериализации в карты с помощью Gson
{
"abc": {
"linkedTo": "count",
// possibly more data...
},
"plmtq": {
"linkedTo": "title",
"decode": "true",
// possibly more data...
}
}
нужно загрузить этот JSON в Map<String, Holder>
, с ключами "abc"
и "plmtq"
.
Ниже мой Holder
класс:
public class Holder {
private final Map<String, String> data;
public Holder(Map<String, String> data) {
this.data = data;
}
// More methods in this class...
}
JSON не соответствует моей классовой структуры, но я не могу изменить JSON или классы.
Что мне нужно - это способ настройки десериализации, поэтому я могу разобрать JSON в Map<String, Holder>
.
Есть ли способ сделать это?
Ниже приведен код, который делает это, но это выглядит слишком сложным и должен быть более простой способ сделать это ...
private static Map<String, Holder> getMap(String jsonLine)
{
Map<String, Holder> holder = new HashMap<>();
JsonElement jelement = new JsonParser().parse(jsonLine);
JsonObject jobject = jelement.getAsJsonObject();
for (Map.Entry<String, JsonElement> entry : jobject.entrySet())
{
Map<String, String> metadata = new HashMap<>();
JsonObject element = entry.getValue().getAsJsonObject();
for (Map.Entry<String, JsonElement> entry2 : element.entrySet())
{
metadata.put(entry2.getKey(), entry2.getValue().getAsString());
}
holder.put(entry.getKey(), new Holder(metadata));
}
return holder;
}
Этот JSON не соответствует вашей иерархии объектов 'Holder'. –
@SotiriosDelimanolis Он подходит? 'holder'' (Карта holder = new HashMap <>();)' map будет иметь ключ как 'abc', и его значение будет' Holder', в котором ключ карты данных имеет 'linkedTo' и значение это 'count'. Аналогично для 'plmtq'. –
john
Извините, ваш метод разбора запутан. Это может быть выполнимо в одной строке с Джексоном. У Gson нет такого синтаксического анализа многих функций. –