Javascript 如何从所有JSON值中删除引号,而不删除节点JS中JSON键中的引号
我正在编写RESTAPI来使用类库执行转换 API接收一个JSON,其中包含如下所示的数据和映射。这是一个简单的例子Javascript 如何从所有JSON值中删除引号,而不删除节点JS中JSON键中的引号,javascript,node.js,json,jsonata,Javascript,Node.js,Json,Jsonata,我正在编写RESTAPI来使用类库执行转换 API接收一个JSON,其中包含如下所示的数据和映射。这是一个简单的例子 { "map":{ "name":"title", "info":"description", "data":{ "text":"blog", "date":"date" } }, "data":{ "title":"title1", "descr
{
"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
}
}
{
"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
}
}
{
"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接受映射的格式,那么转换它将轻而易举。例如:
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格式的字符串接受。谢谢您的回复 我将整个地图作为字符串传递 转义字符出现在地图中,用于引用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中做任何事情。不确定,但是这个
{“name”:title,“info”:description,“data”:{“text”:blog,“date”:date}
似乎是错误的,除非title
,description
。。。。是变量declared标题和描述是JSON数据中的JSON路径。下面给出了JSON的数据。“数据”:{“title”:“title1”,“description”:“description1”,“blog”:“这是一个blog.”,“date”:“11/4/2013”}请查找示例,说明它是无用的-您可以使用与关键字非常相似的字符串,但在这种情况下——如果您设置一个前缀和后缀——一些不应该出现在其他地方的字符或组合,然后在字符串化json中替换它们——并且一些解析器代码也会有所帮助——通常会有一种非常简单的递归字符串化方法。例如,加斯顿C++将我翻译成C。这里方法DumpValue打印json。。。