树结构打印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
相关产品推荐
相关产品推荐

