Postman测试因JSON解析后为字符串导致变量'undefined'失败
问题原因分析与解决
核心原因:服务端返回了双重序列化的JSON
你遇到的问题本质是服务端对数据做了两次JSON序列化操作:
BSON.json_util.dumps()已经将MongoDB的BSON对象转换为了标准的JSON字符串;- 你的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
相关产品推荐
相关产品推荐

