0

在下面的示例中使用多态关联时,是否有一种优雅的方式来处理 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;。为什么不是地图?我应该投到 List 吗?我没有找到任何方法getParents(),例如,只有 setter 。谢谢你。

4

1 回答 1

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 是为了方便运行测试。如果您愿意,您可以对 Jackson 或任何其他 JSON 库产生真正的兴趣。我通常留在JavaLite中,因为这已经足够了。

于 2017-12-13T21:38:38.527 回答