You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:26:01