使用jsonpath进行字符串搜索

时间:2013-08-07 15:20:51

标签: jquery json jsonpath

我有一个巨大的JSON文件,其中包含超过20000个对象。我想在这个json文件中查询一个字符串。但是,使用jsonpath,我只能找到完全匹配的内容?

假设我的文件是:

{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}

我想做的是:

jsonPath(data, "$..book[?(@.title like 'ord')]")

并且在他们的头衔中获得“ord”的书籍。

{ "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
{ "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
}

有可能吗?

1 个答案:

答案 0 :(得分:4)

更新

根据the unit teststhis answer,您可以在表达式中嵌入一个正则表达式文字,它将被逐出。以下是单元测试的示例。

$.menu.items[?(@ && @.label && /SVG/.test(@.label))].id

因此,对于您的示例,它将是:

$.store.book[ ?( @ && @.title && /ord/.test(@.title) ) ].isbn

我已经将jsonPath用于一些非常大的json文件(2-3MB),它们是导致我们的应用程序变慢的原因。如果您一直关注性能问题,我建议您为要搜索的每个字段创建一个补充索引。这样做还允许您对每个字段的相关性值进行加权,这对于获得良好的搜索结果非常重要。

或者更好的是,如果您预计应用程序可能会增长,您可能需要接受服务器端搜索引擎(http://sphinxsearch.com/或SAAS版本http://indexden.com/)。

对于您的具体问题,应该支持类似的运算符。但是,我已经能够通过一系列字符串(例如数据结构中的标题)和使用普通的javascript正则表达式(http://www.w3schools.com/jsref/jsref_obj_regexp.asp)来实现相当不错的性能。