Получение значений по заранее неизвестному ключу в JSON (Java Gson)
Занимаюсь поддержкой тестового кода Java по обработке запросов с сервера при помощи библиотеки Gson. Все было хорошо, до недавнего времени. Входные данные: есть массив из 28000+ строк, приведу часть JSON с интересующей частью:
{
"status": {
"code": code,
"message": "message"
},
"data": {
"datas": [
{
"id": idHere,
"date_gmt": "2020-08-04T07:01:47",
"title": "title1",
"status": "publish",
"data_category": [
263,
495,
492,
68
],
"is-bonus-data": false,
"data-poster": "link here",
"data-preview-sprite": "link here",
"sprite": "link here",
"data-links": {
"3D 180 01_trailer": "link here",
"3D 180 02_trailer": "link here",
"3D 180 03_trailer": "link here",
"3D 180 04_trailer": "link here",
"3D 180 05_trailer": "link here"
},
"data-positions": [
"data-positions1",
"data-positions2"
],
...
}
Данный JSON описан в классе, и при получении все нормально парситься, но...
В последнее время в поле "data-links" стали приходить объекты с ключами, отличающиеся от "стандартных" - "3D 180 01_trailer_001", "3D 360 03_trailer" и т.д. По началу было принято решение добавлять эти ключи как поле класса, и собственно парсить еще и по ним, но сам класс data-links уже раздулся до невероятных размеров.
Класс, который описывает
public class DataLinks {
@SerializedName("3D 180 01_trailer")
@Expose
private String _3D18001Trailer;
@SerializedName("3D 180 02_trailer")
@Expose
private String _3D18002Trailer;
@SerializedName("3D 180 03_trailer")
@Expose
private String _3D1803KTrailer;
@SerializedName("3D 180 04_trailer")
@Expose
private String _3D1804KTrailer;
@SerializedName("3D 180 05_trailer")
@Expose
private String _3D18005Trailer;
}
Вопрос: как обеспечить тестам "вытаскивать" значения по ключам, которые заранее неизвестны?
Смотрел ответы google, самые разные, где люди приводят примеры, самый подходящий был здесь: Как разобрать динамический ключ JSON во вложенном результате JSON, но код начинает плеваться эксепшенами при попытке адаптации.
Ответы (1 шт):
Можете использовать java.util.Map:
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
@Data
static class Test {
@SerializedName("data-links")
private Map<String, String> dataLinks;
}
public static void main(String[] args) {
String json =
"{" +
"\"data-links\": {" +
"\"3D 180 01_trailer\": \"link here\"," +
"\"3D 180 02_trailer\": \"link here\"," +
"\"3D 180 03_trailer\": \"link here\"," +
"\"3D 180 04_trailer\": \"link here\"," +
"\"3D 180 05_trailer\": \"link here\"" +
"}" +
"}";
Test test = new Gson().fromJson(json, Test.class);
System.out.println(
test.dataLinks.entrySet().stream()
.map(e -> e.getKey() + ": " + e.getValue())
.collect(Collectors.joining("\n")));
}
}
Результат:
3D 180 01_trailer: link here
3D 180 02_trailer: link here
3D 180 03_trailer: link here
3D 180 04_trailer: link here
3D 180 05_trailer: link here