根据Java中的值读取特定对象

时间:2018-07-13 22:50:45

标签: java json

我有一些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");

1 个答案:

答案 0 :(得分:0)

AFAIK,搜索JSON对象树没有比迭代更有效的方法。但是与解析对象树的开销相比,搜索的开销实际上很小。

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

如果您只搜索JSON,那么故事就此结束。

如果您要重复搜索相同的JSON,则获得更好性能的方法是:

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

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

或者,将所需的信息提取 just 到满足您需求的数据结构中。


周围有一些库,它们等效于XQuery和XPath for JSON。这种方法肯定比编写一堆迭代代码更方便。例如(来自@ cricket_007的评论):

  

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

有关更多信息:Query a JSONObject in java

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