2633. 将对象转换为 JSON 字符串 🔒
2633. 将对象转换为 JSON 字符串 🔒
题目
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 value1 <= 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
- 所有字符串只包含字母数字字符
解题思路
基本数据类型处理:
- 字符串:需要用双引号包裹,内部的双引号需要转义。
- 数字、布尔值和null:直接转为字符串即可。
数组处理:
- 使用递归处理数组中的每个元素,将结果用逗号连接并用方括号包裹。
对象处理:
- 遍历对象的键(使用
Object.keys()
确保顺序),递归处理每个键值对。 - 每个键需要用双引号包裹,格式为
"key":value
。 - 将结果用逗号连接并用大括号包裹。
- 遍历对象的键(使用
递归结束条件:
- 如果遇到不支持的类型,返回
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 | 扁平化嵌套数组 | [✓] | 🟠 | 🀄️ 🔗 | |
2628 | 完全相等的 JSON 字符串 🔒 | [✓] | 🟠 | 🀄️ 🔗 | |
2675 | 将对象数组转换为矩阵 🔒 | [✓] | 🔴 | 🀄️ 🔗 | |
2700 | 两个对象之间的差异 🔒 | [✓] | 🟠 | 🀄️ 🔗 |