【问题标题】:Java: get Map from ObjectJava:从对象获取地图
【发布时间】:2020-09-27 16:38:16
【问题描述】:

使用此代码

Map<String,Object> payloadMap = new HashMap<String,Object>();
payloadMap = (Map<String,Object>) new Gson().fromJson(result, payloadMap.getClass());

,我把这个json转换成:

{ “名称”:“名称1”, "工作":"检察官", “部”: { "department_name":"检察官办公室" } }

到地图(具有无限个子地图的地图):

这做得很好,但现在我想访问子(嵌套)地图的值。

在父映射中,子映射“包装”到对象。 因此,我尝试从父地图的对象值中获取“包装”的子地图。

  public void mapRequestNode (Map<String,Object> payloadMap) {
    payloadMap.entrySet().forEach(node->this.getDataFromNode(node));
  }

从上图可以看出,子图“department”是没有办法使用的,子图“department”已经被“包裹”到了Object中。我可以访问 Object-methods,但不能访问 Map-methods(例如,我不能使用“value.get("department_name")”。我尝试强制转换“(Map)value”,但是没有成功...

以上案例中的“部门”名称仅作为示例!我不知道 json 子对象的具体名称。可能有无限个名字!所以我不能使用类似“payloadMap.get("department")”的东西

【问题讨论】:

  • X instanceof Object 是一个冗余检查。一切都是
  • 抱歉,“一切都是”是什么意思?
  • 一切都是对象。所以不能是假的

标签: java object hashmap


【解决方案1】:

关注

((Map<String, Object>)payloadMap.get("department")).get("department_name")

应该有效,不是吗?

【讨论】:

  • 可能,这种方式可能适用于只有一个具有知名名称的子地图的情况。但我的任务是迭代无限(自定义)数量的地图子节点。
  • 也许我不明白你,但为什么不使用类似if (value.containsKey("department_name")) 的东西但是,当然,更好的做法是使用 GSON 以更好的方式将其解析为不是映射而是对象,然后检查基类/接口等...
  • Michal Drozd,就我而言,我不知道 json-object 的具体名称。它可以是任何名称,绝对是任何名称
  • 但是你想要做什么对我来说没有任何意义。你想从这些未知物体中得到什么?
  • 我想从这些任何对象中获取价值。例如,对于 ""department_name":"prosecutor's office""。我想知道“检察官办公室”
【解决方案2】:

您的变量value 是Object 类型,这意味着编译器不会知道有关该变量的任何其他信息。即使您从 json 文件中检索的对象是地图,当您将其存储在 Object 变量中时,编译器也会将其作为 Object 而不是 Map 来处理。这就是为什么你不能这样做 value.get("department"); :方法 get 不存在对象类型。

您需要将存储在value.get("department") 中的任何内容转换为Map&lt;String, Object&gt; 才能将其作为地图处理。

【讨论】:

  • 就我而言,我不知道 json-object 的具体名称。它可以是任何名称,绝对是任何名称。所以,我不(也不应该)知道,它是“部门”还是任何其他键!
  • 那么也许一个解决方案是尝试将其读取为 Map 并在无法将其读取为 Map 时捕获异常,例如:try { new ObjectMapper().readValue(value.get("department"), Map.class); } catch (Exception e) {},它远非理想,但它应该工作。
  • 谢谢。请看,我是如何回答我的问题的。
  • 根据我对答案的理解,您只是用另一种方法处理它,但问题仍然存在。您是否尝试过使用 JSONObject 而不是 Map 和 Gson ?这样,您不必将其强制转换为 Map 并且可以直接访问所需格式的数据,并且每个子对象都可以以相同的方式递归访问。如果您不知道 Json 文件的格式,这实际上是我想到的唯一解决方案。
【解决方案3】:

我找到了一个特殊的解决方案。

我将 json 转换为 Map>。 不在 Map 中。在这种情况下,我可以成功使用父 dto-map 的子映射。

但是这个解决方案是特殊的(不是通用的),我可以用这种方式处理json,它只包含对象。

例如,如果我尝试在以下示例中获取“job”的值:

{
   "job": "prosecutor",
  "department": {
                 "department_name":"prosecutor's office"
                 }
}  

通过使用 Map.Entry> payloadNodeEntry.getValue, 我将收到 ClassCastException(无法将 String 转换为 Map )。

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 1970-01-01
    • 2019-08-02
    • 2022-12-10
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多