【问题标题】:How to remove quotes from all JSON Values and do not remove quotes in JSON Key in Node JS如何从所有 JSON 值中删除引号,并且不删除 Node JS 中 JSON 键中的引号
【发布时间】:2020-01-11 10:16:41
【问题描述】:

我正在编写 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 对象来删除 value 中的引号。

    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 } } 似乎是错误的,除非 title,description.... 是变量声明
  • 标题和描述是数据JSON中的JSON路径。数据 JSON 如下所示。 "data":{ "title":"title1", "description":"description1", "blog":"This is a blog.", "date":"11/4/2013" } 请找样本@ 987654322@
  • 会告诉它没用 - 您可以使用与键名非常相似的字符串,但是如果您设置前缀和后缀怎么办 - 一些不应该在其他任何地方的字符或组合然后用字符串化的 json 替换它们?
  • 一些解析器代码也可以提供帮助——通常有非常简单的递归字符串化方法。例如我翻译成 C# 的 Gason C++。这里github.com/eltomjan/Gason/blob/master/src/ValueWriter.cs方法DumpValue打印json...

标签: javascript node.js json jsonata


【解决方案1】:

使用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 格式的字符串。

【讨论】:

    【解决方案2】:

    感谢您的所有回复。

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

    转义字符出现在地图中,用于 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 中做任何事情。

    【讨论】:

      猜你喜欢
      • 2020-04-12
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      相关资源
      最近更新 更多