【问题标题】:How to parse a string with special symbols using nodejs?如何使用nodejs解析带有特殊符号的字符串?
【发布时间】:2018-12-21 12:24:21
【问题描述】:

我想将字符串转换为 json 对象,但无法转换。因为我使用的是带有特殊符号的字符串。我必须从 JSON 文件中读取查询。这是我使用的名为 functions.json 的文件。

[
{
    "function":"Promo1",
    "query1": "{%24and:[{\"createdOn\":{%24lte:\"1712086400000\"}},{\"country\": \"India\"},{\"Type\": \"App\"}]}",
    "query2": "{\"country\": \"India\"}"
}
]

在这个文件中有很多对象。我必须先读取文件然后我会动态获取函数名称我必须从该对象获取适当的函数查询。所以考虑我想要 Promo1 查询从那个对象。我能够得到这个 query1 字段值。之后我将 unescape query1 字符串中的特殊符号,以便我将 $ 而不是 %24。我正在使用此代码来转义字符串 var q1 = unescape(str_arry[0].query1);

在 unescape q1 持有一个字符串值 {$and:[{"createdOn":{$lte:"1712086400000"}},{"country": "India"},{"Type": "App"}]} 之后。我正在使用将此字符串转换为 Object

  {$and:[{"createdOn":{$lte:"1712086400000"}},{"country": "India"},{"Type": "App"}]}

由于 $ 符号,我无法使用 JSON.parse 进行解析。我收到此错误

SyntaxError: JSON 中位置 1 的意外标记 $

谁能帮我解决这个问题?

【问题讨论】:

  • 那不是 JSON。最好修复任何发送损坏的输入
  • 是的,这是一个猫鼬查询。它是字符串类型
  • 这不是有效的 JSON。您可以从使其成为有效的 JSON 开始。问题不是$,而是缺少引号。
  • 我同意这不是一个有效的 JSON 我的问题是如何将它转换为 JSON 对象?
  • 考虑解释你的情况。如果你想用 JSON.parse 解析它,通常你不应该有这样的字符串。

标签: javascript node.js mongoose


【解决方案1】:

字符串不是有效的 JSON,因为对象键应该用双引号引起来,根据JSON specification

避免此问题的一个简单方法是首先不将数据存储为 JSON。如果functions 是应用程序的一部分,则可以将数据存储为 JS,并具有各种优势,包括更宽松的语法要求:

module.exports = [
  {
    function: "Promo1",
    query1: {$and:[{"createdOn":{$lte:"1712086400000"}},{"country": "India"},{"Type": "App"}]}
  }
];

如果query1 是一个字符串至关重要(尽管 这里不是这种情况,因为 query1 应该被转换回对象),它可以就地字符串化,所以对象保持可读:

module.exports = [
  {
    function: "Promo1",
    query1: JSON.stringify({$and:[{"createdOn":{$lte:"1712086400000"}},{"country": "India"},{"Type": "App"}]})
];

将查询存储为 JSON 的正确方法是根据 JSON 规范对其进行字符串化。如果手动编写有效的 JSON 有问题,可以输出为:

JSON.stringify({$and:[{"createdOn":{$lte:"1712086400000"}},{"country": "India"},{"Type": "App"}]})

或者,可以使用任何第三方 JSON 格式化程序。

【讨论】:

  • 是的,我可以使用,但我必须将此文件保存在远程位置。所以我不能使用 module.exports
  • 那么您将不得不编写有效的 JSON,因为如果我们希望它像有效的 JSON 一样被解析,我们通常会这样做。也不清楚为什么 JSON 中有 JSON。 query1 可以是对象而不是字符串。
  • 是的,我知道。从文件中读取后,整个内容都在字符串中。所以我无法将其转换为对象
  • 然后您将整个内容转换为带有JSON.parse 的对象。这只需要做一次。问题中的数据要求您在query1 上第二次执行JSON.parse,这似乎是不需要的。
【解决方案2】:

JSON 需要所有的属性键都用引号括起来才能有效,因此您需要将 json 字符串更改为 {"$and":[{"createdOn":{"$lte":"1712086400000"}},{"country": "India"},{"Type": "App"}]} 才能解析它。

也许猫鼬有办法做到这一点,否则你会被字符串操作困住。

var json_str = '{"$and":[{"createdOn":{"$lte":"1712086400000"}},{"country": "India"},{"Type": "App"}]}';

var obj = JSON.parse( json_str );

console.log( obj );

【讨论】:

  • 感谢您的回答。但最后我不想引用 $and 和 $lte
  • 我期望输出是 {$and:[{"createdOn":{$lte:"1712086400000"}},{"country": "India"},{"类型”:“应用程序”}]}
  • 我的问题是为什么?它在功能上是一样的。如果您不想要引号,则不能使用 JSON.parse() 或者您必须在解析对象后再次删除引号。
  • @SyedAyeshaBebe 键只能是 $and 和 $lte?
  • @imudin07 我没听明白?
【解决方案3】:

请测试一下,这可能会解决您的问题

{"$and":[{"createdOn":{"$lte":"1712086400000"}},{"country": "India"},{"Type": "App"}]}

【讨论】:

  • 对不起!!我不想在转换为 JSON 对象后引用 $and
  • 如果这是 mongoose 查询比它的罚款你不需要删除报价 mongo 会接受这个
  • param = { '$and': [{ 'dated': { '$gte': new Date(strtdate).getTime() } }, { 'dated': { '$lte' : new Date(enddate).getTime() } }] } } return await Devicelogs.find(param).count();
  • 使用 ' 而不是 " 仅用于检查
【解决方案4】:

我们可以借助 JSON.stringify() 方法解决这个问题。

let dataWith$ = { '$and': [ { 'createdOn': {'$lte':"1712086400000"} },
                             { 'country': 'India' },
                             { 'Type': 'App' } ] 
                }

let parsedData = JSON.parse( JSON.stringify( dataWith$)); // It won't give you error
console.log( typeof parsedData ) // object
console.log( parsedData.$and) // [ { createdOn:{'$lte':'1712086400000'} },  { country: 'India' },  { Type: 'App' } ]

【讨论】:

  • 你能给我解决这个问题 { '$and': [ { 'createdOn': {'$lte':"1712086400000"} }, { 'country': 'India' },{ '类型': '应用程序' } ] }?通过将其转换为 Object
【解决方案5】:

parse 没有任何要求,这已经是您在parse 之后得到的。

var obj ={$and:[{"createdOn":{$lte:"1712086400000"}},{"country": "India"},{"Type": "App"}]};

console.log(obj);

console.log(typeof obj);
function getKeyVal(ob){
Object.keys(ob).forEach(function(key) {
  console.log("key > " +key +  " value > "+JSON.stringify(ob[key]));
})
}
getKeyVal(obj);

【讨论】:

    【解决方案6】:

    在 JSON 键中使用特殊符号的原因必须用双引号或单引号括起来。如果您无法手动更改, 您可以使用 JSON stringify 方法进行转换。

    var convertToJson = {$and:[{"createdOn":{$lte:"1712086400000"}},{"country": "India"},{"Type": "App"}]}
    convertToJson = JSON.stringify(convertToJson)
    console.log(convertToJson)

    然后你就可以照常解析数据了

    console.log(JSON.parse(convertToJson)) 
    

    【讨论】:

      【解决方案7】:

      如果这仍然是字符串并且键总是像 $and、$lte 或 $abc。 这可能是一个解决方案:

      var json_str = '{$and:[{"createdOn":{$lte:"1712086400000"}},{"country": "India"},{"Type": "App"}]}';
      
      // put quotes to all keys which start from $
      json_str = json_str.replace(/\{(\$[a-zA-Z]+)\:/g,'{"$1":');
      
      var obj = JSON.parse( json_str );
      
      console.log( obj );

      【讨论】:

        【解决方案8】:

        如果我理解你,你想把你的对象转换成一个有效的 JSO 对象吗?

        在这种情况下,您可以像我在这里所做的那样解析对象的字符串化版本:

        var obj = {$and:[{"createdOn":{$lte:"1712086400000"}},{"country": "India"},{"Type": "App"}]};
        
        var jsonObj = JSON.parse(JSON.stringify(obj));
        console.log(jsonObj);

        另一个灵魂可能是使用 JSON.parse() 的 eval insetad:

        var objStr = [{
          "function": "Promo1",
          "query1": "{%24and:[{\"createdOn\":{%24lte:\"1712086400000\"}},{\"country\": \"India\"},{\"Type\": \"App\"}]}",
          "query2": "{\"country\": \"India\"}"
        }];
        
        var q1 = eval('(' + unescape(objStr[0].query1) + ')');
        console.log(q1);

        【讨论】:

          猜你喜欢
          • 2011-04-11
          • 1970-01-01
          • 2011-08-21
          • 2017-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-15
          相关资源
          最近更新 更多