跳至主要內容

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


2633. 将对象转换为 JSON 字符串 🔒open in new window

🟠   🔗 力扣open in new window LeetCodeopen in new window

题目

Given a value, return a valid JSON string of that value. The value can be a string, number, array, object, boolean, or null. The returned string should not include extra spaces. The order of keys should be the same as the order returned by Object.keys().

Please solve it without using the built-in JSON.stringify method.

Example 1:

Input: object =

Output:

Explanation:

Return the JSON representation.

Note that the order of keys should be the same as the order returned by Object.keys().

Example 2:

Input: object =

Output:

Explanation:

The primitives of JSON are strings, numbers, booleans, and null.

Example 3:

Input: object = {"key":{"a":1,"b":[{},null,"Hello"]}}

Output: {"key":{"a":1,"b":[{},null,"Hello"]}}

Explanation:

Objects and arrays can include other objects and arrays.

Example 4:

Input: object = true

Output: true

Explanation:

Primitive types are valid inputs.

Constraints:

  • value is a valid JSON value
  • 1 <= JSON.stringify(object).length <= 10^5
  • maxNestingLevel <= 1000
  • all strings contain only alphanumeric characters

题目大意

现给定一个值,返回该值的有效 JSON 字符串。你可以假设这个值只包括字符串、整数、数组、对象、布尔值和 null。返回的字符串不能包含额外的空格。键的返回顺序应该与 Object.keys() 的顺序相同。

请你在不使用内置方法 JSON.stringify 的前提下解决这个问题。

示例 1:

输入: object =

输出:

解释:

返回该对象的 JSON 表示形式。

注意,键的返回顺序应该与 Object.keys() 的顺序相同。

示例 2:

输入: object =

输出:

解释:

JSON 的基本类型是字符串、数字型、布尔值和 null。

示例 3:

输入: object = {"key":{"a":1,"b":[{},null,"Hello"]}}

输出: {"key":{"a":1,"b":[{},null,"Hello"]}}

解释:

对象和数组可以包括其他对象和数组。

示例 4:

输入: object = true

输出: true

解释:

基本类型是有效的输入

提示:

  • value 是一个有效的 JSON 值
  • 1 <= JSON.stringify(object).length <= 10^5
  • maxNestingLevel <= 1000
  • 所有字符串只包含字母数字字符

解题思路

  1. 基本数据类型处理

    • 字符串:需要用双引号包裹,内部的双引号需要转义。
    • 数字布尔值null:直接转为字符串即可。
  2. 数组处理

    • 使用递归处理数组中的每个元素,将结果用逗号连接并用方括号包裹。
  3. 对象处理

    • 遍历对象的键(使用 Object.keys() 确保顺序),递归处理每个键值对。
    • 每个键需要用双引号包裹,格式为 "key":value
    • 将结果用逗号连接并用大括号包裹。
  4. 递归结束条件

    • 如果遇到不支持的类型,返回 null 或抛出错误。

复杂度分析

  • 时间复杂度O(n),其中 n 是输入值的总元素数量,每个元素只被处理一次。
  • 空间复杂度O(n),在递归调用和拼接字符串时,需要额外的空间来存储结果。

代码

var stringify = function (object) {
	// 处理字符串
	if (typeof object == 'string') {
		return '"' + object + '"';
	}

	// 处理数字、布尔值、null
	if (
		typeof object === 'number' ||
		typeof object === 'boolean' ||
		object == null
	) {
		return String(object);
	}

	// 处理数组
	if (Array.isArray(object)) {
		return '[' + object.map((i) => stringify(i)).join(',') + ']';
	}

	// 处理对象
	if (typeof object === 'object') {
		return (
			'{' +
			Object.keys(object)
				.map((key) => stringify(key) + ':' + stringify(object[key]))
				.join(',') +
			'}'
		);
	}

	// 如果是无法处理的类型,返回 null
	return null;
};

相关题目

题号标题题解标签难度
2625扁平化嵌套数组open in new window[✓]
2628完全相等的 JSON 字符串 🔒open in new window[✓]
2675将对象数组转换为矩阵 🔒open in new window[✓]
2700两个对象之间的差异 🔒open in new window