【问题标题】:Get parents from JSON when using polymorphic associations使用多态关联时从 JSON 获取父级
【发布时间】:2017-12-13 13:18:12
【问题描述】:

在以下示例中使用多态关联时,是否有一种优雅的方式来处理 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。

这是我在ParametersControllerSpec 中测试 JSON 响应的方式:

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。谢谢。

【问题讨论】:

  • 我可以得到这样的父母:Map parents = (Map) siteSettingsMaps[0].get("parents");。然后我可以得到网站列表:List&lt;Map&gt; sites = (List&lt;Map&gt;) parents.get("sites");。正确的 ?但是如何获取 Site 对象(不是其键/值的 Map 才能获取 Site parent Section ?或者我的测试方式错误?

标签: javalite activeweb jspec


【解决方案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 内,这样就足够了。

【讨论】:

  • 啊,好的,谢谢伊戈尔。对我来说,对 Map 和 Maps 数组的转换有点棘手。我明白了。
猜你喜欢
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
相关资源
最近更新 更多