Получить родителей из 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 модели: 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() я не нашел, например, для этого есть только сеттер. Спасибо.


person belgoros    schedule 13.12.2017    source источник
comment
Я могу получить таких родителей: Map parents = (Map) siteSettingsMaps[0].get("parents");. Затем я могу получить список сайтов: List<Map> sites = (List<Map>) parents.get("sites");. Правильный ? Но как получить объект Site (а не карту его ключа/значения, чтобы иметь возможность получить Site parent Section? Или я неправильно тестирую?   -  person belgoros    schedule 13.12.2017


Ответы (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, так как этого достаточно.

person ipolevoy    schedule 13.12.2017
comment
А, хорошо, спасибо Игорь. Приведение к карте и массиву карт было для меня немного сложным. Я понял. - person belgoros; 14.12.2017