Получить родителей из 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, так как этого достаточно.

Другие вопросы по тегам