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

Greasemonkey POST提交JSON数据时浮点数小数点被替换为下划线问题求助

问题根因
  • 核心错误为请求头声明的载荷格式与实际提交的载荷格式不匹配:你将JSON序列化后的字符串作为请求体提交,但请求头的Content-Type配置为application/x-www-form-urlencoded,后端会按照表单键值对的规则解析JSON字符串,直接触发你遇到的所有异常。
  • 三个异常的具体触发逻辑:后端会把整段JSON字符串识别为表单的第一个键名,没有对应值;部分服务端中间件会自动对表单键名做HTML实体编码、同时把键名中的特殊字符(小数点)替换为下划线,完全符合你反馈的现象。
  • GM.xmlHttpRequest的data参数仅支持字符串、FormData、Blob类型的入参,直接传入普通对象、数组会被自动转为[object Object]这类无效内容,必须提前做序列化处理,额外添加非官方支持的dataType参数不会生效。
解决方案

方案1:提交JSON格式载荷

如果后端支持接收JSON类型的请求数据,直接修改Content-Type为JSON对应类型即可:

let jsonString = JSON.stringify(json); 

GM.xmlHttpRequest({
  method: "POST",
  url: "https://exampleau.tld",
  data: jsonString,
  headers: {
    "Content-Type": "application/json; charset=utf-8"
  },
  onload: function(response) {
    // 业务逻辑
  }
});

该方案下后端直接解析原始请求体即可获取完整的JSON结构,不会出现转义、字符替换等异常。

方案2:提交表单格式载荷

如果后端仅支持application/x-www-form-urlencoded格式的请求,需要先把JSON对象转换为表单键值对格式的字符串再提交:

// 将JSON对象转为表单格式字符串
const formDataStr = new URLSearchParams(json).toString();

GM.xmlHttpRequest({
  method: "POST",
  url: "https://exampleau.tld",
  data: formDataStr,
  headers: {
    "Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
  },
  onload: function(response) {
    // 业务逻辑
  }
});

内容的提问来源于stack exchange,提问作者Roman K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:36:06