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



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

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

使用基于流的解析器,并对解析事件处理程序进行编码,以查找要提取的信息,这可能比"解析到JSONObject"做得更好。如果您要查找的信息接近JSON序列化的开始,那么您可以在搜索"命中"后立即放弃解析,从而节省时间。

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

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

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

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

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


有一些库可以为JSON执行相当于XQuery和XPath的操作。这种方法肯定比编写一堆迭代代码更方便;例如(来自@cricket_007的评论(:

JSONPath查询[例如]将是$.attributesMappings[?(@.domainType == "WI")]

有关更多信息:在java中查询JSONObject

然而,如果您正在寻找更高效的解决方案,我会犹豫是否使用"JSON查询"库。

最新更新