Ruby如何带截断打印JSON payload对象?
处理Google Spreadsheets API长Payload的截断打印方案
不需要全局修改Array的pretty_print方法,以下几个本地化方案可以满足需求,只针对特定Payload做截断处理:
1. 自定义递归截断函数
自己实现一个递归遍历对象的函数,遇到超过长度阈值的数组时替换为描述文本,其他内容保持原样。这种方式完全可控,不会影响全局代码。
function truncateLongArrays(obj, threshold = 100) { // 处理数组 if (Array.isArray(obj)) { if (obj.length > threshold) { return `Array(${obj.length} items)`; } // 短数组递归处理内部元素 return obj.map(item => truncateLongArrays(item, threshold)); } // 处理对象(非null) if (typeof obj === 'object' && obj !== null) { const result = {}; for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { result[key] = truncateLongArrays(obj[key], threshold); } } return result; } // 基础类型直接返回 return obj; } // 使用示例 const apiPayload = { spreadsheetId: 'abc123', range: 'Sheet1!A1:Z', rows: Array(12000).fill({ values: ['foo', 'bar'] }) }; // 处理后打印 console.log(JSON.stringify(truncateLongArrays(apiPayload), null, 2));
输出效果:
{ "spreadsheetId": "abc123", "range": "Sheet1!A1:Z", "rows": "Array(12000 items)" }
2. 用Lodash简化递归处理
如果项目里已经用了Lodash,可以用cloneDeepWith方法快速实现自定义截断逻辑,代码更简洁:
const _ = require('lodash'); const truncatedPayload = _.cloneDeepWith(apiPayload, (value) => { if (Array.isArray(value) && value.length > 100) { return `Array(${value.length} items)`; } }); console.log(JSON.stringify(truncatedPayload, null, 2));
3. Node.js环境下利用util.inspect自定义格式化
Node.js的util.inspect支持自定义格式化器,可以针对数组设置特殊处理,打印时自动截断长数组,且不会全局修改Array的原型:
const util = require('util'); const inspectConfig = { depth: null, // 展开所有层级 formatters: { '[object Array]': (arr) => { if (arr.length > 100) { return `Array(${arr.length} items)`; } // 短数组使用默认格式化 return util.inspect(arr, { ...inspectConfig, formatters: undefined }); } } }; console.log(util.inspect(apiPayload, inspectConfig));
为什么不推荐全局修改Array的pretty_print?
全局修改Array原型上的方法会影响整个应用中所有数组的打印行为,可能导致其他模块的调试输出异常,甚至引发难以排查的bug。本地化处理只针对需要调试的Payload,风险更低、更可控。
内容的提问来源于stack exchange,提问作者hakunin
相关产品推荐
相关产品推荐

