如何在Node JS中从所有JSON值中删除引号,但不删除JSON键中的引号

3

我正在编写REST API,使用像JSONata这样的库执行转换。

API接收一个包含数据和映射的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);
});


地图变量包含以下内容。
{ 
      "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值有对象等复杂情况时,复杂度会增加。

而且在每组键值对之间应该放置一个逗号“,”。

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

JSON数据希望值为以下没有引号的JSON路径。

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


1
不确定,但是这个代码似乎有问题:{ "name":title, "info":description, "data":{ "text":blog, "date":date } },除非 titledescription…… 是已经声明的变量。 - brk
标题和描述是数据JSON中的JSON路径。 以下是数据JSON。 "data": {      "title": "title1",      "description": "description1",      "blog": "这是一个博客。",      "date": "11/4/2013" } 请在此处查找示例(http://try.jsonata.org/HJXxE9TEH)。 - user3497702
可以说这是无用的 - 您可以像使用键名一样处理字符串,但是如果您设置了前缀和后缀 - 一些字符或组合不应出现在其他任何地方,然后在字符串化的JSON中替换它们呢? - Tom
还有一些解析器代码也可以提供帮助 - 通常有相当简单的递归字符串化方法。例如,我将 Gason C++ 翻译成了 C#。这里 https://github.com/eltomjan/Gason/blob/master/src/ValueWriter.cs 中的 DumpValue 方法打印 json... - Tom
2个回答

4

使用 JSON.stringify() 将您的函数不必担心的类型进行字符串化,并利用 maps 和模板字符串(它们可以为对象修复逗号问题)来简化代码:

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接受地图的格式,那么转换就会非常容易。例如:

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}}

您也可以将地图作为JSONata格式的字符串接受。


0

感谢您的所有回复。

我将整个地图作为字符串传递。

转义字符由Newtosoft用于引号和其他字符。


string db_model = System.IO.File.ReadAllText(@"..\Test.Just.Net.Core.3.0\App_Data\JSONATA\JSONTab\db_model_tab.json");
var api_param_db_model = JObject.Parse(db_model);
JObject api_param_object = new JObject();
api_param_object.Add("map", transform);
api_param_object.Add("data", api_param_db_model.SelectToken("$"));


请查看传递给Node.js API的数据样本。
{  
   "map":"{ \r\n\t\"name\":title,\r\n\t\"info\":description,\r\n\t\"data\":{ \r\n\t\t\"text\":blog,\r\n\t\t\"date\":date\r\n\t}\r\n}",
   "data":{  
      "title":"title1",
      "description":"description1",
      "blog":"This is a blog.",
      "date":"11/4/2013"
   }
}

有了这些数据,我在node.js中就不需要做任何事情了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接