JSON.stringify和JSON.parse参数详解

本文深入讲解了JSON.stringify()和JSON.parse()方法的使用,包括如何使用replacer参数进行数据筛选和处理,以及如何利用space参数美化输出。同时,提供了丰富的代码示例帮助理解。
部署运行你感兴趣的模型镜像

JSON.stringify()

JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串,如果指定了replacer是一个函数,则可以选择性的替换值,或者如果指定了replacer是一个数组,可选择性的仅包含数组指定的属性。

JSON.stringify(value[, replacer [, space]])

参数:

value,将要序列化成 一个JSON 字符串的值。

replacer 可选,如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为null或者未提供,则对象所有的属性都会被序列化;如果是数组相当于是对序列化数据的一个筛选过滤,函数就是对原数据的处理。

space 可选,指定缩进用的空白字符串,用于美化输出;如果参数是个数字,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;如果该参数为字符串(字符串的前十个字母),该字符串将被作为空格;如果该参数没有提供(或者为null)将没有空格。

返回值 :一个表示给定值的JSON字符串。

replacer参数

replacer参数可以是一个函数或者一个数组。作为函数,它有两个参数,键(key)值(value)都会被序列化。

  • 如果返回一个 Number, 转换成相应的字符串被添加入JSON字符串。
  • 如果返回一个 String, 该字符串作为属性值被添加入JSON。
  • 如果返回一个 Boolean, "true" 或者 "false"被作为属性值被添加入JSON字符串。
  • 如果返回任何其他对象,该对象递归地序列化成JSON字符串,对每个属性调用replacer方法。除非该对象是一个函数,这种情况将不会被序列化成JSON字符串。
  • 如果返回undefined,该属性值不会在JSON字符串中输出。

注意: 不能用replacer方法,从数组中移除值(values),如若返回undefined或者一个函数,将会被null取代。

例子(function)

function replacer(key, value) {
  if (typeof value === "string") {
    return undefined;
  }
  return value;
}

var foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
var jsonString = JSON.stringify(foo, replacer);//{"week":45,"month":7}.

const students = [
  {
    name: 'akira',
    score: 100,
  }, {
    name: 'John',
    score: 60,
  }, {
    name: 'Jane',
    score: 90,
  }
];

function replacer(key, value) {
  if(key === 'score') {
    if (value === 100) {
      return 'S';
    } else if(value >= 90) {
      return 'A';
    } else if(value >= 70) {
      return 'B';
    } else if(value >= 50) {
      return 'C';
    } else {
      return 'E';
    }
  }
  return value;
}

JSON.stringify(students,replacer,4);
//上面的代码,我们通过replacer将成绩从百分制替换为SABCE的成绩。
/*
"[
    {
        "name": "akira",
        "score": "S"
    },
    {
        "name": "John",
        "score": "C"
    },
    {
        "name": "Jane",
        "score": "A"
    }
]"
*/

例子(array)

如果replacer是一个数组,数组的值代表将被序列化成JSON字符串的属性名。并且是递归的操作

JSON.stringify(foo, ['week', 'month']);  
// '{"week":45,"month":7}', 只保留“week”和“month”属性值。

const students = [
  {
    name: 'akira',
    score: 100,
  }, {
    name: 'John',
    score: 60,
  }, {
    name: 'Jane',
    score: 90,
  }
];

JSON.stringify(students,["name"],4);
/*
"[
    {
        "name": "akira"
    },
    {
        "name": "John"
    },
    {
        "name": "Jane"
    }
]"
*/

space 参数

space 参数用来控制结果字符串里面的间距。如果是一个数字, 则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多10个空格);如果是一个字符串,则每一级别会比上一级别多缩进用该字符串(或该字符串的前十个字符)。

JSON.stringify({ a: 2 }, null, " ");   // '{\n "a": 2\n}'

使用制表符(\t)来缩进:

JSON.stringify({ uno: 1, dos : 2 }, null, '\t')
// '{            \
//     "uno": 1, \
//     "dos": 2  \
// }'

 

JSON.parse()

JSON.parse() 方法用来解析JSON字符串,构造由字符串描述的JavaScript值或对象。提供可选的reviver函数用以在返回之前对所得到的对象执行变换(操作)。

语法:JSON.parse(text[, reviver])

参数:text要被解析成JavaScript值的字符串,reviver 可选,转换器, 如果传入该参数(函数),可以用来修改解析生成的原始值,调用时机在parse函数返回之前。

返回值:Object类型, 对应给定JSON文本的对象/值。

例子:

JSON.parse('{"p": 5}', function (k, v) {
    if(k === '') return v;     // 如果到了最顶层,则直接返回属性值,
    return v * 2;              // 否则将属性值变为原来的 2 倍。
});                            // { p: 10 }

JSON.parse('{"1": 1, "2": 2,"3": {"4": 4, "5": {"6": 6}}}', function (k, v) {
    console.log(k); // 输出当前的属性名,从而得知遍历顺序是从内向外的,
                    // 最后一个属性名会是个空字符串。
    return v;       // 返回原始属性值,相当于没有传递 reviver 参数。
});


const str = '{"result":true, "count":42}';

const result = JSON.parse(str, (key, value) => {
  if(typeof value === 'number') return value * 2;
  return value;
});

console.log(result); // {result: true, count: 84}

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>我们被问到JSON.stringify方法的参数用途。JSON.stringify用于将JavaScript值转换为JSON字符串。 它有3个参数: 1. value: 要转换为JSON字符串的值。 2. replacer(可选): 可以是函数或数组,用于过滤或转换结果。 3. space(可选): 用于控制结果字符串的缩进,可以是数字或字符串。 下面细说明每个参数常见用途。 </think>### 回答:JavaScript 中 JSON.stringify参数详解 `JSON.stringify()` 是将 JavaScript 值转换为 JSON 字符串的核心方法,它有多种参数组合用于控制序列化过程。以下是完整解析代码示例: #### 1. **核心参数解析** ```javascript // 完整语法:JSON.stringify(value, replacer, space) // 参数 1: value - 必需,要转换的值 const obj = { name: "Alice", age: 30 }; console.log(JSON.stringify(obj)); // '{"name":"Alice","age":30}' // 参数 2: replacer - 可选,过滤或转换属性 // 类型 1: 函数 (key, value) => newValue const withFunc = JSON.stringify(obj, (key, value) => key === "age" ? undefined : value // 过滤 age 属性 ); console.log(withFunc); // '{"name":"Alice"}' // 类型 2: 数组 - 白名单属性 const withArray = JSON.stringify(obj, ["name"]); console.log(withArray); // '{"name":"Alice"}' // 参数 3: space - 格式化输出 // 类型 1: 数字(缩进空格数) console.log(JSON.stringify(obj, null, 2)); /* 输出: { "name": "Alice", "age": 30 } */ // 类型 2: 字符串(缩进字符) console.log(JSON.stringify(obj, null, '--')); /* 输出: { --"name": "Alice", --"age": 30 } */ ``` #### 2. **replacer 函数的进阶用法** ```javascript const data = { date: new Date(), // 日期对象 fn: function() {}, // 函数 symbol: Symbol('id'), // Symbol undefinedProp: undefined // undefined }; // 自定义序列化逻辑 const customStringify = JSON.stringify(data, (key, val) => { if (val instanceof Date) return val.toISOString(); // 日期转字符串 if (typeof val === 'function') return val.toString(); // 函数转源码 if (typeof val === 'symbol') return val.description; // Symbol转描述 if (val === undefined) return "UNDEFINED"; // 替换undefined return val; // 其他值保持不变 }); console.log(customStringify); // 输出:{"date":"2023-10-05T00:00:00.000Z","fn":"function() {}","symbol":"id","undefinedProp":"UNDEFINED"} ``` #### 3. **对象的 toJSON 方法** 当对象有 `toJSON` 方法时,`JSON.stringify` 会优先调用它: ```javascript class User { constructor(name, id) { this.name = name; this.id = id; } toJSON() { return { username: this.name.toUpperCase(), userId: `#${this.id}` }; } } const user = new User("Bob", 123); console.log(JSON.stringify(user)); // '{"username":"BOB","userId":"#123"}' ``` #### 4. **特殊值处理规则** ```javascript // 类型转换规则表 const specialValues = { undefined: JSON.stringify(undefined), // undefined → undefined(在数组中变为null) function: JSON.stringify(() => {}), // 函数 → undefined symbol: JSON.stringify(Symbol('test')), // Symbol → undefined infinity: JSON.stringify(Infinity), // Infinity → null nan: JSON.stringify(NaN), // NaN → null date: JSON.stringify(new Date()), // Date → ISO字符串 set: JSON.stringify(new Set([1,2,3])), // Set → {} map: JSON.stringify(new Map([['a',1]])), // Map → {} arrayWithHole: JSON.stringify([1,,3]), // 稀疏数组 → [1,null,3] cyclicObject: (() => { const obj = { a: 1 }; obj.self = obj; return JSON.stringify(obj); // 循环引用 → TypeError })() }; console.log(specialValues); ``` #### 5. **性能优化与陷阱** ```javascript // 场景 1: 大数据集优化(使用replacer过滤) const bigData = Array(10000).fill({ x: 1, y: 2 }); const optimized = JSON.stringify(bigData, (key, val) => key === 'y' ? undefined : val // 减少30%数据量 ); // 场景 2: 避免转换错误 try { const circularRef = {}; circularRef.self = circularRef; JSON.stringify(circularRef); // 抛出TypeError } catch (e) { console.error("循环引用错误:", e.message); } // 场景 3: 安全深拷贝(简单对象) const original = { a: 1, b: { c: 2 } }; const deepCopy = JSON.parse(JSON.stringify(original)); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值