Получить родителей из JSON при использовании полиморфных ассоциаций
Существует ли элегантный способ работы с ответом 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 модели: параметр как полиморфная модель, со столбцами 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()
Например, для этого есть только сеттер. Спасибо.
1 ответ
Это проще, чем вы думаете. На данный момент, это вопрос работы с JSON, который не имеет типа, кроме Map и List:
Map[] siteSettingsMaps = JsonHelper.toMaps(x);
the(siteSettingsMaps.length).shouldBeEqual(1);
Map siteSetting = siteSettingsMaps[0];
the(siteSetting.get("value")).shouldBeEqual("fake value");
the(siteSetting.get("store_number")).shouldBeEqual("0070004900049");
Map parents = (Map) siteSetting.get("parents");
List<Map> sites = (List<Map>) parents.get("sites");
the(sites.size()).shouldBeEqual(1);
JsonHelper для удобства запуска тестов. Вы можете по-настоящему полюбить Джексона или любую другую библиотеку JSON, если хотите. Я обычно остаюсь в JavaLite, так как этого достаточно.