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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:42:14