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

树结构打印JSONObject/JSONArray:自定义toString实现问题

解决树结构中子节点JSONArray打印格式问题

我之前刚好碰到过类似的场景,核心问题就是JSONArray默认的toString()会输出方括号格式,咱们要把它改成圆括号,而且不用修改树类的结构也能搞定,给你几个可行的方案:

方案1:打印时手动转换格式(最快最直接)

不需要改任何类,就在你打印子节点的地方,把JSONArray的默认输出字符串做个简单替换就行。比如你拿到子节点的JSONArray后:

// 假设treeNode是你的树节点对象,getChildren()返回JSONArray
JSONArray children = treeNode.getChildren();
// 把默认的[0,4]替换成(0,4)
String formattedChildren = children.toString().replace('[', '(').replace(']', ')');
// 然后打印这个格式化后的字符串
System.out.println(formattedChildren);

这个方法的好处是零侵入,不用动树类或者JSON库的代码,适合快速解决单次需求。如果怕全局替换(比如其他地方的JSONArray不想改格式),就只针对树节点的子节点字段做这个处理就行。

方案2:自定义JSONArray包装类(适合多次复用)

如果你的代码里很多地方需要这种格式,写个包装类重写toString()会更优雅:

import org.json.JSONArray;

public class ParenthesesJSONArray extends JSONArray {
    // 传入原始JSONArray来初始化
    public ParenthesesJSONArray(JSONArray original) {
        super(original);
    }

    @Override
    public String toString() {
        // 先拿到默认的方括号字符串,再替换成圆括号
        String defaultStr = super.toString();
        return defaultStr.replace('[', '(').replace(']', ')');
    }
}

用的时候直接把树节点的子节点包装一下:

JSONArray originalChildren = treeNode.getChildren();
ParenthesesJSONArray formattedArray = new ParenthesesJSONArray(originalChildren);
// 调用toString就直接输出(0,4)了
System.out.println(formattedArray);

这个方法不用每次都写替换逻辑,复用性强,而且也不需要树类传额外参数——我们只是对已有JSONArray对象做包装,和树类的内部实现无关。

方案3:如果树类是自定义的,修改子节点类型(可选)

要是这个树结构是你自己写的,那可以直接把树节点里存储子节点的类型换成咱们的ParenthesesJSONArray,这样后续打印的时候就自动输出圆括号格式了,不用每次手动处理。比如:

public class TreeNode {
    private int id;
    // 把原来的JSONArray换成自定义的ParenthesesJSONArray
    private ParenthesesJSONArray children;

    // 构造方法、getter/setter...
}

不过如果树类是第三方库或者不能修改的,前面两个方案就足够用了。

举个实际的JSON处理例子,假设原JSON结构是:

{
  "id": 1,
  "children": [0,4]
}

用方案1处理后,输出的子节点部分就会变成(0,4),最终打印结果类似:

TreeNode{id=1, children=(0,4)}

内容的提问来源于stack exchange,提问作者Athlete

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:27:11