Есть ли элегантный способ работы с ответом JSON при использовании полиморфных ассоциаций в приведенном ниже примере?
JSON-ответ:
[
{
"created_at":"2017-12-13T10:37:36Z",
"id":16,
"parent_id":21,
"parent_type":"app.models.Site",
"store_number":"0070004900049",
"updated_at":"2017-12-13T10:37:36Z",
"value":"fake value",
"parents":{
"sites":[
{
"created_at":"2017-12-13T10:37:36Z",
"id":21,
"section_id":21,
"updated_at":"2017-12-13T10:37:36Z"
}
]
}
}
]
У меня есть 3 модели: Parameter как полиморфная модель, со столбцами parent_id и parent_type, Site.
Вот как я пытаюсь проверить ответ JSON в ParametersControllerSpec
:
Map[] siteSettingsMaps = JsonHelper.toMaps(responseContent());
the(siteSettingsMaps.length).shouldBeEqual(1);
Map siteSetting = siteSettingsMaps[0];
the(siteSetting.get("value")).shouldBeEqual("fake value");
the(siteSetting.get("store_number")).shouldBeEqual(STORE_NUMBER);
Это нормально до сих пор. Но как извлечь карту родителей? Когда я пробовал так:
Map<String, Map []> parents = (Map<String, Map []>)siteSettingsMaps[0].get("parents");
Map[] sites = parents.get("sites");
Map site = sites[0];
Я получил ava.lang.ClassCastException: java.util.ArrayList cannot be cast to [Ljava.util.Map;
. Почему это не карта? Должен ли я привести к списку? Методов вроде getParents()
я не нашел, например, для этого есть только сеттер. Спасибо.
Map parents = (Map) siteSettingsMaps[0].get("parents");
. Затем я могу получить список сайтов:List<Map> sites = (List<Map>) parents.get("sites");
. Правильный ? Но как получить объект Site (а не карту его ключа/значения, чтобы иметь возможность получитьSite
parentSection
? Или я неправильно тестирую? - person belgoros   schedule 13.12.2017