最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JSON.stringify 的第二个和第三个参数

    正文概述 掘金(宇小墨)   2021-01-22   812

    这两天没事玩 Nodejs 的 fs 模块,用到了 JSON.stringify,因为操作的是 package.json 文件,本身是 json 格式,因此就直接用 JSON.stringifyJSON.parse

    需求&问题:

    • 自定义某些配置,如 name, author, license
    • 读取 package.json 文件,取出数据,将配置重新组合(写入个人的配置),再将数据 JSON.stringify 写入进去
    • 写入后的 数据有个问题,换行回车丢失了,所有配置数据成了一行

    当时写的代码其实也很简单:

    const fs = require('fs')
    
    const data = fs.readFileSync('../package.json', { encoding: 'utf8'})
    const dataObj = JSON.parse(data)
    const newData = JSON.stringify({
      ...dataObj,
      name: "Osmond"
    })
    fs.writeFileSync('../package.test.json', newData, { encoding: 'utf8'})
    

    这样的结果是,虽然 自定义属性 配置写进去了,但是代码格式全丢了,成了一行

    {"name":"Osmond","version":"1.0.0","description":"","main":"index.js"}
    

    当时想着有 2 个办法解决:

    • 使用模板配置文件:handlebars
    • 手动处理字符串,在逗号和括号后加入回车换行符

    第一种方法:

    需要先定义 .hbs 模板文件

    {
      "name": "{{name}}",
      "version": "1.0.0",
      "description": "",
      "main": "index.js"
      }
    

    实现代码为:

    const fs = require('fs')
    
    const sourcePath = './package.test.json.hbs'
    const targetPath = './package.output.json'
    
    const handlebars = require('handlebars')
    
    
    function compile(meta, filePath, templatePath) {
      if (fs.existsSync(templatePath)) {
        const content = fs.readFileSync(templatePath).toString()
        const result = handlebars.compile(content)(meta)
        fs.writeFileSync(filePath, result)
        console.log(`${filePath} 创建成功`)
      }
    }
    
    compile({ name: '测试测试'}, targetPath, sourcePath)
    
    

    第二种方法,写一个正则替换即可。(这里遇到一个问题:Nodejs 中 不支持 String.replaceAll 方法,记录一下)

    总感觉一个简单的 读取和写入,不应该这么麻烦的操作。查找资料发现,原来 JSON.stringify 就可以做到:

    const newData = JSON.stringify({
      ...dataObj,
      name: "Osmond"
    }, null, 2)
    

    我们来重新看它的 API:

    JSON.stringify ( value [, replacer] [ , space] )
    
    • replacer: 作为过滤器使用
    const test = {a:1, b:2, c:3}
    console.log(JSON.stringify(test, ['a', 'b']))
    
    // {"a":1,"b":2}
    
    • space:换行的空格个数
    const test = {a:1, b:2, c:3}
    console.log(JSON.stringify(test, ['a'], 2))
    //{
    //  "a": 1
    //}
    

    至此,如果我要写入格式化的 json 数据,实际只要一行代码:

    const newData = JSON.stringify({
      ...dataObj,
      name: "Osmond"
    }, null, 2)
    

    Oh, yes! 又 get 到一个新知识了

    参考资料:

    • JSON.stringify-MDN
    • 浅谈 JSON.stringify 方法
    • json.stringify()的妙用,json.stringify()与json.parse()的区别

    起源地下载网 » JSON.stringify 的第二个和第三个参数

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元