如何将JavaScript EventSource对象(含数字与字符串属性)转换为JSON?
如何将EventSource及类似不可枚举属性的对象转为JSON
JSON.stringify()和Object.entries()只会处理对象的可枚举自有属性,但EventSource的核心属性(比如readyState、url)大多是不可枚举的,所以直接调用会得到空JSON。以下是两种实用的解决方法:
方法1:手动提取已知属性
如果你清楚需要哪些属性,直接创建新对象存这些属性的值,再序列化:
const eventSource = new EventSource('/stream'); // 提取你需要的属性 const serializableObj = { url: eventSource.url, readyState: eventSource.readyState, withCredentials: eventSource.withCredentials, // 按需添加其他属性 }; // 转为JSON const jsonStr = JSON.stringify(serializableObj);
方法2:自动提取所有自有属性(含不可枚举)
如果想批量获取所有属性,可以用Object.getOwnPropertyNames()拿到对象的所有自有属性名(不管是否可枚举),遍历后提取可安全访问的值:
function serializeES(es) { const result = {}; // 获取所有自有属性名 const allProps = Object.getOwnPropertyNames(es); allProps.forEach(prop => { try { // 尝试获取属性值,避免某些属性访问报错 result[prop] = es[prop]; } catch (err) { console.warn(`跳过属性 ${prop}: ${err.message}`); } }); return JSON.stringify(result); } // 使用示例 const es = new EventSource('/stream'); const jsonStr = serializeES(es);
注意事项
有些属性可能是函数、Symbol类型或者存在循环引用,JSON.stringify()会自动忽略函数,遇到循环引用会抛出错误,可在遍历过程中添加类型判断跳过这些属性:
// 扩展遍历逻辑,跳过函数和Symbol allProps.forEach(prop => { try { const value = es[prop]; if (typeof value !== 'function' && typeof prop !== 'symbol') { result[prop] = value; } } catch (err) { console.warn(`跳过属性 ${prop}: ${err.message}`); } });
内容的提问来源于stack exchange,提问作者Alexander Ites
相关产品推荐
相关产品推荐

