如何使用Node.js替换JSON文件的值字符串且不修改对应键名
问题原因
你现在直接把整份JSON文本传给owo方法处理,会把包括键名、占位符在内的所有内容全都匹配替换,自然就会改到你不想动的键名部分。正确的做法是先把JSON解析成JS对象,递归遍历所有字符串类型的值,仅对这些值做owo转换,最后再序列化为JSON即可。
实现代码
把你原来的代码替换为以下内容即可:
const owo = require('@zuzak/owo') const fs = require('fs') // 递归处理对象的方法,仅转换字符串值 const processObject = (obj) => { // 数组类型遍历元素处理 if (Array.isArray(obj)) { return obj.map(item => processObject(item)) } // 对象类型遍历键值对处理 if (typeof obj === 'object' && obj !== null) { const newObj = {} for (const key in obj) { // 键名原样保留,仅处理对应的值 newObj[key] = processObject(obj[key]) } return newObj } // 仅字符串类型的值做owo转换 if (typeof obj === 'string') { return owo(obj) } // 数字、布尔、null等其他类型原样返回 return obj } // 文件读写逻辑 const rawJson = fs.readFileSync('../jsonfile.json', 'utf-8') const originData = JSON.parse(rawJson) const processedData = processObject(originData) // 第三个参数2是为了生成格式化的JSON,不需要可以删掉 fs.writeFileSync('../owo.json', JSON.stringify(processedData, null, 2), 'utf-8')
可选优化
如果你不想转换{1}、{EndDate}这类带占位符的字符串,可以在字符串转换的判断逻辑中增加过滤规则:
if (typeof obj === 'string') { // 包含{}占位符的字符串不做转换,不需要该规则可以删除该判断 if (!obj.includes('{') && !obj.includes('}')) { return owo(obj) } return obj }
内容的提问来源于stack exchange,提问作者user17193891
相关产品推荐
相关产品推荐

