如何在使用jsonpath时过滤包含圆括号(或括号)的字符串?

时间:2013-11-16 07:33:15

标签: javascript json jsonpath

js代码是......

var queryString = 'Dolphin Travels (Sagar Travels)';
var results = jsonPath(jsonvar, "$.availableTrips[?("+queryString+")]");

错误:

SyntaxError: jsonPath: unterminated string literal: _v.travels == 'Dolphin Travels (Sagar Travels)

enter image description here

1 个答案:

答案 0 :(得分:0)

首先,让我们了解一些先决条件:

您正在搜索'Dolphin Travels(Sagar Travels)',但我在您的测试数据中没有看到这一点(至少您已经显示过),所以我无法真正分辨出对象/数组的哪个部分它在(无论是价值还是关键)。

以下是我正在使用的示例数据:

var t = {
    'availableTrips': [
        {
            'busType': 'Volvo A/C-Multi Axle Semi sleeper (2+2)',
            'busTypeId': '101',
            'fares': 250,
            'travels': 'SVR Tours and Travel [Citizen]'
        },
        {
            'busType': 'Lorem Ipsum',
            'busTypeId': '102',
            'fares': 300,
            'travels': 'SVR Tours and Travel [Citizen]'
        }
    ]
}

简单使用jsonPath(我还假设你的意思是this jsonPath library,因为你没有指定):

jsonPath(t,'$.availableTrips[?(/SVR/.test(@.travels))]');

产生availableTrips数组中的对象数组,因为字符串SVR(作为正则表达式)都在它们中。

jsonPath(t,'$.availableTrips[?(/Volvo/.test(@.busType))]');

仅产生availableTrips数组中的第一项,相当于t.availableTrips[0]


现在,回答你的问题:

转义时,您可以使用反斜杠\,但由于您处于解释的字符串中,因此您需要将其转义为TWICE:\\。一旦将字符串作为jsonParse的参数发送,并再次作为在jsonParse内解释的表达式的一部分。像这样:

jsonPath(t,'$.availableTrips[?(/\\(2\\+2\\)/.test(@.busType))]');

请注意,我还必须转义+量词,以及()组元字符。

在消毒用户输入方面,例如var queryString = 'Dolphin Travels (Sagar Travels)';,您可以执行以下操作(请参阅What special characters must be escaped in regular expressions?):

var sanitizedQueryString = queryString.replace(/([\.\^\$\*\+\?\(\)\[\{\\\|])/g,'\\$1');