JSON字符串构建报错排查:Expecting 'STRING', '}', got 'undefined'
JSON生成与Web服务调用问题排查
问题描述
使用以下代码生成JSON字符串:
let jsonString = "{ \"AjaxBookGenieParams\": " + JSON.stringify(ajaxBookGenieParams) + " }";
调用Web服务时出现500 Internal Server Error,提示:missing value for parameter: ajaxBookGenieParams;用JSONLint校验生成的字符串时,得到错误:Expecting 'STRING', '}', got 'undefined'。
问题原因
- JSON格式非法:
核心问题是JSON.stringify(ajaxBookGenieParams)返回了undefined,导致最终拼接出的JSON字符串为{"AjaxBookGenieParams": undefined}。而JSON规范不允许undefined作为有效值,只能使用null、字符串、数字、对象、数组、true/false,这直接触发了JSONLint的校验错误。 - 服务端解析失败:
服务端无法解析非法的JSON结构,因此返回500错误,并判定ajaxBookGenieParams参数缺失。 - 触发场景:
ajaxBookGenieParams变量未定义或被赋值为undefined;ajaxBookGenieParams包含循环引用(如对象引用自身),导致JSON.stringify无法正常序列化;- 手动拼接JSON字符串的方式易引入语法错误,可靠性远低于直接序列化完整对象。
解决方法
- 确保变量有效:先确认
ajaxBookGenieParams已被正确定义并赋值为合法对象,无循环引用。 - 避免手动拼接JSON:改用完整对象序列化的方式生成JSON字符串,避免语法错误:
若// 构造完整参数对象后序列化 let requestParams = { AjaxBookGenieParams: ajaxBookGenieParams }; let jsonString = JSON.stringify(requestParams);ajaxBookGenieParams可能为undefined,可提前处理为默认对象:let requestParams = { AjaxBookGenieParams: ajaxBookGenieParams || {} }; let jsonString = JSON.stringify(requestParams);
内容的提问来源于stack exchange,提问作者BedfordNYGuy
相关产品推荐
相关产品推荐

