将 JSON 查询字符串解析为 JSON 对象

Posted

技术标签:

【中文标题】将 JSON 查询字符串解析为 JSON 对象【英文标题】:Parsing a JSON query string into a JSON object 【发布时间】:2015-07-14 22:35:18 【问题描述】:

API 上的查询结构如下:

../myapi/products?_q=genre,retail_price&_a=g,p&p.gt=10&p.lt=20&g.eq=POP

有两个数组:_q 列出查询参数,_a 列出相应的别名。所以 p -> retail_price 和 g -> 流派

我可以把它解析成:

$and : [ genre:  '$eq': 'POP' , retail_price:  '$gt': '10' , retail_price:  '$lt': '20'  ]

几乎很开心。但是这种方法有几个问题: 1. '$eq' 等而不是 $eq 等 2.数值现在是字符串'10'

我认为(2)是一个讨厌的。由于服务器无法知道类型(可能应该是 '10' 而不是 10)。

所以,我想尝试另一种方法。这就是将它全部解析成一个查询字符串,然后用 JSON.parse() 进行转换

首先我提出了一些查询字符串并在 shell 中尝试:

db.products.find($and: [genre:  $eq: 'ROC', retail_price: $gt:7, retail_price: $lt:10])

像魅力一样工作。

然后我尝试了这个:

var queryStr = "$and: [genre:  $eq: 'ROC', retail_price: $gt:7, retail_price: $lt:10]";

并且:(产品是猫鼬模型)

Product.find(JSON.parse(queryStr), function(err, product) 
    if (err)
        res.send(err);

        res.json(product);
    );

令我惊讶的是,它根本不起作用。

也在做

console.log(JSON.stringify(JSON.parse(queryStr)));

不将输出写入控制台。

这里发生了什么?

【问题讨论】:

【参考方案1】:

第一件事是queryStr 无效JSON。你所拥有的是一个看起来像一个对象的字符串。但你可能会问“那不是 JSON 吗?”。简短的回答:没有。长答案:由于 JSON 是一种轻量级的数据交换格式,它必须能够被多种语言(不仅仅是 javascript)读取。所以引用键是实现这一点的必要条件:

var json = '"foo": true, "bar": 123';
var str = 'foo: true, bar: 123';
console.log(JSON.parse(json)); // Object foo: true, bar: 123
console.log(JSON.parse(str)); // SyntaxError: Unexpected token f

因此,您可以将查询对象stringify 转换为 JSON,然后在将其传递给您的 mongoose 方法之前对其进行解析:

// On the client
var queryJSON = JSON.stringify($and: [genre:  $eq: 'ROC', retail_price: $gt:7, retail_price: $lt:10]);
// On the server
var query = JSON.parse(queryJSON); // Object

也就是说,回到你最初的两个问题:

    引用的键名:它们在这方面的影响为零,因此根本不必担心。 不正确的值类型:看起来您已经有一个将查询格式化为正确对象的过程,因此您可以使用Number 将字符串强制转换为数字值。 (例如Number('10') // 10

【讨论】:

超级!我现在确实可以做我想做的事了。实际上,为了让服务器知道一个数字确实是一个数字,我添加了一些语法(例如 p.eg=(10),而不是 p.eq=10)。它现在就像一个魅力。我现在可以写如下内容:../products?_q=genre,filling_rate,retail_price&_a=g,f,p&g.eq=ROC&f.eq=(95)&p.lt=(8) 我应该补充一点,当使用带有模式的 Mongoose 时,不需要添加 (..)。

以上是关于将 JSON 查询字符串解析为 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

js 将json字符串转换为json对象的方法解析(转)

js 将json字符串转换为json对象的方法解析

js 将json字符串转换为json对象的方法解析

js 将json字符串转换为json对象的方法解析

js 将json字符串转换为json对象的方法解析

js 将json字符串转换为json对象的方法解析