嵌套JSONObject取值的最优方案:链式调用 vs 提前获取子对象
毫无疑问,提前提取name对象的方式是更优的选择,不管是从代码可读性、可维护性还是潜在的性能角度,都比重复链式调用要好。下面具体分析两者的差异:
代码可读性与简洁性
链式调用的写法重复了order.getJSONObject("name")三次,显得冗余又啰嗦。把JSONObject name = order.getJSONObject("name")提前提取出来后,后续的取值代码只需要聚焦在具体的字段key上,逻辑一目了然,其他开发者读代码时能快速理解你是在操作name这个子对象下的内容。可维护性
如果后续业务需要修改"name"这个键的名称,链式调用得修改3处地方,很容易漏改;而提前提取的写法只需要改1处,出错概率大幅降低。另外,如果"name"对应的对象可能为null,你只需要在提取时做一次null检查(比如if (name != null)),就能避免后续所有取值操作的空指针问题;链式调用的话,每次调用都可能抛出异常,要么重复处理异常,要么冒着崩溃的风险。性能层面(差异虽小但存在)
以常用的org.json库为例,getJSONObject本质是从内部的键值对映射中查找对象,每次调用都会执行一次查找逻辑。提前提取只需要查找一次,链式调用要重复三次——单次查找的开销确实可以忽略,但在循环处理大量JSON数据的场景下,累积的性能差异还是能体现出来的。
这里给你一个更健壮的改进版代码示例:
JSONObject name = order.getJSONObject("name"); if (name != null) { item.put(ITEM_COUNT, name.getString("key1")); item.put(PRICE, name.getLong("key2")); JSONObject key3Obj = name.getJSONObject("key3"); if (key3Obj != null) { item.put(ITEM_NAME, key3Obj.getString("key4")); } }
当然,如果你的JSON结构极简单,且只需要取值一次,链式调用也不是完全不能用,但从代码最佳实践的角度,提前提取子对象是更值得推荐的方式,尤其是在需要多次操作同一个子对象的场景下。
内容的提问来源于stack exchange,提问作者saicharan

