Skip to content

2633. 将对象转换为 JSON 字符串

2633. 将对象转换为 JSON 字符串

ts
type JSONValue =
  | null
  | boolean
  | number
  | string
  | JSONValue[]
  | { [key: string]: JSONValue }

function jsonStringify(value: JSONValue): string {
  if (value === null) return 'null'
  if (typeof value === 'number' || typeof value === 'boolean')
    return String(value)
  if (typeof value === 'string') return `"${value}"`

  if (Array.isArray(value)) {
    const res = value.map((v) => jsonStringify(v))
    return `[${res.join(',')}]`
  }

  if (typeof value === 'object') {
    const res = Object.entries(value).map(
      ([key, val]) => `"${key}":${jsonStringify(val)}`
    )
    return `{${res.join(',')}}`
  }

  return ''
}

递归结构

JSON.stringify 本质上是一个递归遍历器。它根据当前值的类型决定如何序列化:

  • null → 字符串 "null"
  • number/boolean → 直接转字符串(String(value)
  • string → 包裹双引号
  • array → [ + 递归处理每个元素 + ]
  • object → { + 递归处理每个 key-value 对 + }

递归的终止条件是遇到基本类型,最大深度取决于对象的嵌套层级。

这个实现没有处理的情况

完整的 JSON.stringify 还需要处理很多边界:

  • 特殊数字NaNInfinity 应返回 "null",而非 "NaN" / "Infinity"
  • undefined 和函数:作为对象属性值时应被忽略,作为数组元素时应转为 null
  • 循环引用:抛出 TypeError
  • 字符串转义:双引号、反斜杠、换行符等需要转义
  • toJSON 方法:如果对象有 toJSON(),应序列化其返回值

题目里的 JSONValue 类型被限制在特定子集内,所以大部分边缘情况不会出现。放到完整实现里,字符串转义、特殊值和循环引用这些分支都还需要补齐。