【问题标题】:Read a particular object on the basis of value in java [duplicate]根据java中的值读取特定对象[重复]
【发布时间】:2018-07-13 22:50:44
【问题描述】:

我有一些 json 数据

{
 "attributesMappings": [
   {
     "domainType": "WI",
     "attribute": [
       {
        "staticAttributes": [
          {
            "attributeName": "test",
            "attributeValue": "test",
            "required": true
           }
         ]
       }
     ]
   },
   {
     "domainType": "PI",
     "attribute": null
   }
 ]
}

我可以使用

读取对象
JSONArray vendorData = mainObj.getJSONArray("attributesMappings");

假设我只想获取域类型为“WI”的对象,我知道可以使用

JSONObject obj = vendorData.getJSONObject(0);

然后我可以执行操作,假设我不知道“WI”将存储在哪个索引处,有没有办法获取数据。我知道我们可以遍历数组项并匹配 domainType。

我们是否可以通过在 getJSONObject 中使用“WI”或类似的东西来获得完整的对象。

JSONObject domainType = attributeMappings.getJSONObject("WI");

【问题讨论】:

  • 我知道我们可以遍历数组项并匹配 domainType。 那么问题出在哪里?
  • 寻找更有效的方法。假设数据嵌套很深,那么问题就大了。
  • 对此您无能为力。您可以构建一个映射来避免多次查找的迭代,但如果它只是您所追求的一个值,那将是不值得的。
  • @Devon_C_Miller JavaScript 问题对 Java 有何帮助?

标签: java json


【解决方案1】:

AFAIK,没有比迭代 JSON 对象树更有效的方法来搜索它。但与解析对象树的成本相比,搜索的成本实际上会很小。

您可能比使用基于流的解析器的“解析为 JSONObject”做得更好,并对解析事件处理程序进行编码以查找您尝试提取的信息。如果您要查找的信息接近 JSON 序列化的开头,您可以通过在搜索“命中”后立即放弃解析来节省时间。

如果您只对 JSON 进行一次搜索,那么故事就结束了。

如果要重复搜索同一个 JSON,那么获得更好性能的方法是:

  1. 解析 JSON 树,或将其映射到 POJO 树
  2. 为内存树构造一个单独的索引数据结构。
  3. 使用索引加快搜索速度。

因此,在您的示例中,您可能会基于 domainType 字段为所有属性映射构建索引。

或者,将只是您想要的信息提取到为您的需要而设计的数据结构中。


周围有一些库可以为 JSON 执行相当于 XQuery 和 XPath 的功能。这种方法绝对比编写一堆迭代代码更方便;例如(来自@cricket_007 的评论):

JSONPath 查询[对于您的示例] 将是 $.attributesMappings[?(@.domainType == "WI")]

欲了解更多信息:Query a JSONObject in java

但是,如果您正在寻找一个更有效的解决方案,我会犹豫是否使用“JSON 查询”库。

【讨论】:

  • 添加注释:JSONPath 查询将是$.attributesMappings[?(@.domainType == "WI")]
猜你喜欢
  • 1970-01-01
  • 2020-12-08
  • 2021-05-31
  • 2016-11-04
  • 1970-01-01
  • 2017-05-06
  • 2016-09-16
  • 2017-09-29
  • 1970-01-01
相关资源
最近更新 更多