You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

原因分析

  1. JSON.stringify的转义规则:JSON规范要求字符串中的特殊字符(如换行符\n)必须被转义为\\n,所以JSON.stringify会自动处理换行符,确保生成的JSON格式合法。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:57:21