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

时间:2015-05-05 09:15:45

标签: json node.js mongoose stringify

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)。

所以,我想尝试另一种方法。然后将它全部解析为queryString,然后使用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 个答案:

答案 0 :(得分: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

那说,回到原来的两个问题:

  1. 引用的关键名称:它们在这方面没有任何影响,所以它们根本不应该成为一个问题。
  2. 错误的值类型:看起来您已经有一个将查询格式化为正确对象的过程,因此您可以使用Number将字符串强制转换为数字值。 (例如Number('10') // 10