如何在JavaScript中识别Ruby on Rails控制器返回的空JSON对象?
如何在JavaScript中识别Rails返回的空JSON对象
我太懂你遇到的这个坑了!当Rails控制器返回"{}"这种空JSON字符串时,直接按常规思路判断经常会失效,尤其是没处理好字符串转对象这一步的话,之前的判断逻辑自然没用。下面给你几个靠谱的解决方案:
首先要做的:解析后端返回的JSON字符串
Rails返回的"{}"是字符串格式的JSON,你得先把它转换成JavaScript对象,否则所有针对对象的判断都不生效:
// 假设从后端拿到的响应数据是字符串 const rawResponse = '{}'; const parsedData = JSON.parse(rawResponse); // 转换成JS空对象 {}
方法1:通过Object.keys()判断键的数量
Object.keys()会返回对象所有可枚举属性的数组,空对象的数组长度为0。同时加上constructor判断,可以避免误判null、数组等非纯对象类型:
function isEmptyJsonObject(obj) { // 先确保是纯对象,再判断键的数量 return Object.keys(obj).length === 0 && obj.constructor === Object; } // 测试用例 isEmptyJsonObject(parsedData); // 返回 true isEmptyJsonObject({ name: 'test' }); // 返回 false isEmptyJsonObject(null); // 返回 false(避免误判)
方法2:使用Object.entries()判断键值对数量
和上面的思路类似,Object.entries()返回对象的键值对数组,空对象的数组长度同样为0:
function isEmptyJsonObject(obj) { return Object.entries(obj).length === 0 && obj.constructor === Object; }
方法3:兼容旧浏览器的遍历判断
如果你的项目需要兼容ES5之前的浏览器,可以用for...in循环配合hasOwnProperty来检查对象是否有自身属性:
function isEmptyJsonObject(obj) { // 先排除非对象类型 if (obj.constructor !== Object) return false; // 遍历所有属性,只检查对象自身的属性(排除继承的属性) for (let key in obj) { if (obj.hasOwnProperty(key)) { return false; } } return true; }
为什么你之前的判断无效?
大概率是这两个原因:
- 没有把后端返回的字符串
"{}"解析成JS对象,直接对字符串做对象相关的判断(比如rawResponse === {}),字符串和对象是完全不同的类型,肯定不相等; - 只判断了键的数量,没有排除
null、数组等非纯对象类型,导致出现误判或者报错。
内容的提问来源于stack exchange,提问作者satish
相关产品推荐
相关产品推荐

