我有一些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,那么获得更好性能的方法是:
- 解析JSON树,或将其映射到POJO树
- 为内存中的树构造一个单独的索引数据结构
- 使用索引可以加快搜索速度
因此,在您的示例中,您可以基于domainType
字段为所有属性映射构建一个索引。
或者,将仅您想要的信息提取到专为您的需求设计的数据结构中。
有一些库可以为JSON执行相当于XQuery和XPath的操作。这种方法肯定比编写一堆迭代代码更方便;例如(来自@cricket_007的评论(:
JSONPath查询[例如]将是
$.attributesMappings[?(@.domainType == "WI")]
有关更多信息:在java中查询JSONObject
然而,如果您正在寻找更高效的解决方案,我会犹豫是否使用"JSON查询"库。