如何在JavaScript中向JSON查询添加字符串变量且不产生多余转义
问题原因
- 你定义的
queryString不是合法JSON格式:JSON要求顶层必须是单个对象或数组,你当前的字符串是两个独立对象用逗号拼接,没有外层包裹结构,所以JSON.parse()会直接抛出语法异常。 - 直接把字符串插入
must数组时,JS会将其识别为普通字符串元素,序列化请求时自然会给字符串加引号、转义内部引号,无法变成你需要的查询对象。
最优解决方案(推荐)
不要拼接JSON字符串,直接通过JS数组动态生成查询对象,完全规避转义和格式问题:
// 1. 动态构建match查询数组,可根据你的过滤器数量灵活增删元素 const matchQueries = [ { "match": { "log.level": "Information" } }, { "match": { "metadata.log_event_category": "Open Id Connect" } } ] // 动态新增查询的示例: // if (用户选中了日志级别过滤器) matchQueries.push({ match: { "log.level": 选中的级别 } }) // 2. 通过扩展运算符把match查询展开到must数组中 var request = { "size": 0, "query": { "bool": { "must": [ ...matchQueries, { "range": { "@timestamp": { "gte": chartArray[0].dateTimeFrom, "lte": chartArray[0].dateTimeTo } } } ] } }, "aggs": { "myAggName": { "date_histogram": { "field": "@timestamp", [elasticIntervalType]: elasticIntervalUnits, "format": chartArray[0].scaleLabelAttributes } }, } }
最后直接调用JSON.stringify(request)即可得到无多余转义的合法请求JSON。
兼容你现有字符串的解决方案(不推荐)
如果必须使用现有的queryString格式,给字符串外层加上方括号转为合法数组JSON后再解析:
// 给原有字符串外层加[],变成合法数组JSON var queryString = '[{ "match": { "log.level": "Information" } }, { "match": { "metadata.log_event_category": "Open Id Connect" } }]' var request = { "size": 0, "query": { "bool": { "must": [ // 解析后展开数组 ...JSON.parse(queryString), { "range": { "@timestamp": { "gte": chartArray[0].dateTimeFrom, "lte": chartArray[0].dateTimeTo } } } ] } }, "aggs": { "myAggName": { "date_histogram": { "field": "@timestamp", [elasticIntervalType]: elasticIntervalUnits, "format": chartArray[0].scaleLabelAttributes } }, } }
内容的提问来源于stack exchange,提问作者OJB1
相关产品推荐
相关产品推荐

