JSON.stringify转义\n问题:如何替换为\n确保evalscript正常解析?
问题描述
将jsonreq传入createOptionsFor()方法并赋值给body对象时,JSON.stringify(jsonreq)输出的evalscript中所有换行符都显示为\n(转义后的形式),导致脚本无法被服务器正常识别。尝试用JSON.stringify(jsonreq).replace('\\n','\n')解决,但换行符问题依旧。
相关代码
class HTTPAPI { #options = undefined; #agent = undefined; constructor() { this.#options = undefined this.#agent = tunnel.httpsOverHttp({ proxy: { host: 'xx.xx-xx.xx', port: '3000', }, }); } createOptionsFor(reqMethod, headers, jsonreq) { return this.#options = { agent: this.#agent, protocol: resources.PROTOCOL_HTTPS.description, host: resources.HOST.description, path: encodeURI ( resources.PATH.description + resources.PROCESS.description ), method: reqMethod, headers: headers, body:JSON.stringify(jsonreq) }; } // 其他代码省略 } module.exports = HTTPAPI;
jsonreq中的evalscript字段
{ // 其他字段省略 "evalscript": `//VERSION=3 function setup() { return { input: [{ bands: ["B01", "B08"], units: "DM" }], output: { bands: 1, sampleType: SampleType.FLOAT32 }, mosaicking: Mosaicking.ORBIT } } function updateOutput(outputs, collection) { Object.values(outputs).forEach((output) => { output.bands = collection.scenes.length; }); } function updateOutputMetadata(scenes, inputMetadata, outputMetadata) { var dds = []; for (i=0; i<scenes.length; i++){ dds.push(scenes[i].date) } outputMetadata.userData = { "acquisition_dates": JSON.stringify(dds) } } function evaluatePixel(samples) { var n_observations = samples.length; let ndvi = new Array(n_observations).fill(0); samples.forEach((sample, index) => { ndvi[index] = (sample.B08/2 - sample.B04/2) / (sample.B08/4 + sample.B04) ; }); return ndvi; }` }
当前输出
body: '.....,"evalscript":"//VERSION=3\n function setup() {\n return {\n input: [{\n bands: [\"B04\", \"B08\"],\n units: \"DN\"\n }],\n output: {\n bands: 1,\n sampleType: SampleType.FLOAT32\n },\n mosaicking: Mosaicking.ORBIT\n }\n }\n\n function updateOutput(outputs, collection) {\n Object.values(outputs).forEach((output) => {\n output.bands = collection.scenes.length;\n });\n }\n function updateOutputMetadata(scenes, inputMetadata, outputMetadata) { var dds = [];\n for (i=0; i<scenes.length; i++){\n dds.push(scenes[i].date)\n }\n outputMetadata.userData = { \"acquisition_dates\": JSON.stringify(dds) }\n }\n \n function evaluatePixel(samples) {\n var n_observations = samples.length;\n let ndvi = new Array(n_observations).fill(0);\n samples.forEach((sample, index) => {\n ndvi[index] = (sample.B08 - sample.B04) / (sample.B08 + sample.B04) ;\n }); \n return ndvi;\n }"}'
原因分析
- JSON.stringify的转义规则:JSON规范要求字符串中的特殊字符(如换行符
\n)必须被转义为\\n,所以JSON.stringify会自动处理换行符,确保生成的JSON格式合法。 - replace方法的局限性:你使用的
replace('\\n','\n')只会替换第一个匹配的\\n,而字符串中存在大量换行符,因此无法全部替换。
解决方案
方案1:全局替换转义的换行符
使用正则表达式的全局匹配标志g,将所有\\n替换为\n:
createOptionsFor(reqMethod, headers, jsonreq) { return this.#options = { // 其他配置不变 body: JSON.stringify(jsonreq).replace(/\\n/g, '\n') }; }
方案2:确认服务器解析逻辑(无需替换)
实际上,当服务器接收到JSON格式的数据并进行解析时,会自动将\\n还原为\n。如果服务器是按照标准JSON解析的,你不需要手动替换,当前的JSON.stringify结果是完全合法的,可以正常被服务器解析并还原换行符。建议先验证服务器的解析逻辑,避免不必要的替换操作。
内容的提问来源于stack exchange,提问作者Amrmsmb
相关产品推荐
相关产品推荐

