我正在编写 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/