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

Postman测试因JSON解析后为字符串导致变量'undefined'失败

问题原因分析与解决

核心原因:服务端返回了双重序列化的JSON

你遇到的问题本质是服务端对数据做了两次JSON序列化操作:

  1. BSON.json_util.dumps() 已经将MongoDB的BSON对象转换为了标准的JSON字符串;
  2. 你的Web框架(比如Flask/Django等)又把这个JSON字符串当作普通字符串,再次进行了JSON序列化,最终返回的响应是一个被转义包裹的字符串(外层带引号,内部所有引号都被转义)。

举个例子:

  • 正常应该返回的JSON响应:{"first_name":"张三"}
  • 实际返回的响应:"{\"first_name\":\"张三\"}"

这种情况下,在Postman里执行JSON.parse(responseBody),得到的结果只是内层的JSON字符串("{\"first_name\":\"张三\"}"),而非JS对象,所以访问jsonData.first_name自然会得到undefined。

为什么在JavaScript REPL里解析正常?

因为你把原始响应复制到REPL时,大概率是手动去掉了外层的引号,直接将内层的JSON字符串({"first_name":"张三"})作为输入,此时一次JSON.parse就能得到对象。如果严格复制Postman里的原始响应(带外层引号和转义符)到REPL,同样会出现和Postman一样的问题。

验证方法

在Postman的测试脚本里先打印原始响应:

console.log("原始响应:", responseBody);

如果输出的内容是带外层双引号、内部引号被转义的字符串,就说明确实是双重序列化导致的问题。

解决办法

方案1(推荐:从服务端修复)

修改服务端代码,让框架直接返回BSON.json_util.dumps()生成的字符串,不要让框架自动做JSON序列化:

  • 比如在Flask中,不要用return jsonify(result),而是直接return result, 200, {"Content-Type": "application/json"}(其中result是dumps()生成的字符串);
  • 在Django中,直接返回HttpResponse(result, content_type="application/json")即可。

方案2(临时:Postman脚本中处理)

如果暂时没法修改服务端,可以在Postman测试脚本中做两次JSON解析:

const jsonStr = JSON.parse(responseBody);
const jsonData = JSON.parse(jsonStr);
console.log(jsonData.first_name); // 此时就能正常访问属性

内容的提问来源于stack exchange,提问作者Jay05

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:45:32