javascript - 如何从所有 JSON 值中删除引号并且不删除 Node JS 中 JSON 键中的引号

标签 javascript node.js json jsonata

我正在编写 REST API 以使用类似 JSONata 的库执行转换.

API 接收一个包含数据和 map 的 JSON,如下所示。这是一个简单的例子。

{ 
   "map":{ 
      "name":"title",
      "info":"description",
      "data":{ 
         "text":"blog",
         "date":"date"
      }
   },
   "data":{ 
      "title":"title1",
      "description":"description1",
      "blog":"This is a blog.",
      "date":"11/4/2013"
   }
}

Node.JS 代码如下。

app.post('/JSONTransform', function (req, res, next) {
    const data = req.body.data;
    const map = req.body.map;
    var expression = jsonata(map);
    var result = expression.evaluate(data);
    res.send(result);
});

map 变量包含以下内容

{ 
      "name":"title",
      "info":"description",
      "data":{ 
         "text":"blog",
         "date":"date"
      }
}

JSONdata 期望值为不带引号的 JSON 路径,如下所示。

{ 
      "name":title,
      "info":description,
      "data":{ 
         "text":blog,
         "date":date
      }
}

请建议仅删除所有 JSON 值中的引号的最佳选项。

我编写函数通过迭代 JSON 对象来删除值中的引号。

    function jsoniterate(map) {

        Object.keys(map).forEach(key => {
            console.log(map[key]);
            if (typeof (map[key]) == 'object') {
                arr1.push('"' + key + '": {');
                jsoniterate(map[key]);
                arr1.push('}');
            }
            else {
                arr1.push('"' + key + '":' + map[key]);
            }

        });
    }

但是当 JSON 值有 object 等时,复杂度会增加。 并且 ',' 应该放在每组键值对之间。

我找到了一些使用正则表达式的解决方案,但该解决方案仅针对 JSON 值中的数值。在这里,它应该适用于所有 JSON 值

JSONdata 期望值为不带引号的 JSON 路径,如下所示。

{ 
      "name":title,
      "info":description,
      "data":{ 
         "text":blog,
         "date":date
      }
}

最佳答案

使用 JSON.stringify() 将您的函数不应该担心的类型字符串化,并利用带有映射的模板字符串(它们修复了对象的逗号问题)来简化代码:

function stringify(k, v) {
  if(typeof v == 'string') {
    return `"${k}": ${v}`;
  } else if(typeof v == 'object') {
    return `"${k}": {${Object.entries(v).map(([k, v]) => stringify(k, v))}}`;
  } else {
    return `"${k}": ${JSON.stringify(v)}`;
  }
}

stringify("map", map)
//outputs "map": {"name": title,"info": description,"data": {"text": blog,"date": date}}

话虽这么说,但我认为这不是解决此问题的最佳方法。

如果您更改了 API 接受 map 的格式,那么转换它就会变得轻而易举。例如:

const map = { 
  "'name'":"title",
  "'info'":"description",
  "'data'":{ 
      "'text'":"blog",
      "'date'":"date"
  }
};

JSON.stringify(map).replace(/"/g, "").replace(/\'/g, "\"");
//returns {"name":title,"info":description,"data":{"text":blog,"date":date}}

您也可以只接受 map 作为 JSONata 格式的字符串。

关于javascript - 如何从所有 JSON 值中删除引号并且不删除 Node JS 中 JSON 键中的引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57857528/

相关文章:

node.js - Nodejs Socket.io Express 调用 HTTP API 后握手失败

json - 尝试在 JSLint 中验证 JSON 文件时出现解析错误

json - 如何解码以下 JSON?

javascript - 可变语言(浏览器语言检测)- 不适用于 safari

javascript - 谷歌地图绘制文物

javascript - 日期选择器 : disable days using drop down list?

node.js - 在node.js中将两个url合并为一个

javascript - 使用 node-forge 加密并使用 python 和 RSA-OAEP 解密

java - 如何使用 jackson 将 json 文档的额外属性反序列化为 map 或其他字段?

javascript - 使用 Javascript 检查 HTML 片段在视觉上是否为空