Gson自定义适配器优化咨询:write函数是否有更优写法?
Gson自定义TypeAdapter写入逻辑优化建议
你提到因为JSON有时会返回字符串而非对象,所以编写了自定义适配器,作为Gson和Java新手,想优化当前的write方法。先贴出你的原代码:
@Override public void write(JsonWriter jsonWriter, Description description) throws IOException { jsonWriter.beginObject(); jsonWriter.name("extra"); jsonWriter.beginArray(); List<Extra> extra = description.getExtra(); for (int i = 0; i < extra.size(); i++) { writeExtra(jsonWriter, extra.get(i)); } jsonWriter.endArray(); jsonWriter.name("text"); jsonWriter.value(description.getText()); jsonWriter.endObject(); } private void writeExtra(JsonWriter jsonWriter, Extra extra) throws IOException { jsonWriter.beginObject(); if (extra.isBold()) { jsonWriter.name("bold"); jsonWriter.value(true); } if (extra.isStrikeThrough()) { jsonWriter.name("strikeThrough"); jsonWriter.value(true); } if (extra.getColor() != null) { jsonWriter.name("color"); jsonWriter.value(extra.getColor()); } if (extra.getExtra() != null) { jsonWriter.name("extra"); jsonWriter.beginArray(); for (int i = 0; i < extra.getExtra().size(); i++) { writeExtra(jsonWriter, extra.getExtra().get(i)); } jsonWriter.endArray(); } if (extra.getText() != null) { jsonWriter.name("text"); jsonWriter.value(extra.getText()); } jsonWriter.endObject(); }
几个优化方向及优化后代码:
- 用增强for循环替代索引循环:避免索引操作冗余,代码更简洁,同时降低索引越界风险
- 提取重复的数组写入逻辑:把嵌套的extra数组写入逻辑抽成独立方法,减少代码重复
- 增加集合非空判断:避免集合为null时触发空指针异常,提升代码健壮性
- 链式调用简化代码:将
name()和value()调用链式串联,减少行数
优化后的代码:
@Override public void write(JsonWriter jsonWriter, Description description) throws IOException { jsonWriter.beginObject(); jsonWriter.name("extra").beginArray(); List<Extra> extraList = description.getExtra(); if (extraList != null) { for (Extra extra : extraList) { writeExtra(jsonWriter, extra); } } jsonWriter.endArray(); jsonWriter.name("text").value(description.getText()); jsonWriter.endObject(); } private void writeExtra(JsonWriter jsonWriter, Extra extra) throws IOException { jsonWriter.beginObject(); if (extra.isBold()) { jsonWriter.name("bold").value(true); } if (extra.isStrikeThrough()) { jsonWriter.name("strikeThrough").value(true); } if (extra.getColor() != null) { jsonWriter.name("color").value(extra.getColor()); } // 调用抽离的方法处理嵌套extra数组 writeNestedExtraArray(jsonWriter, extra.getExtra()); if (extra.getText() != null) { jsonWriter.name("text").value(extra.getText()); } jsonWriter.endObject(); } // 抽离嵌套extra数组的写入逻辑 private void writeNestedExtraArray(JsonWriter jsonWriter, List<Extra> extraList) throws IOException { if (extraList == null || extraList.isEmpty()) { return; } jsonWriter.name("extra").beginArray(); for (Extra extra : extraList) { writeExtra(jsonWriter, extra); } jsonWriter.endArray(); }
额外说明:
- 如果你的
Description.getExtra()和Extra.getExtra()业务上不会返回null,那空判断可以去掉,但保留能让代码更健壮 - 核心序列化逻辑完全保留,只是优化了代码结构和写法,不会影响你处理"JSON有时返回字符串而非对象"的场景
内容的提问来源于stack exchange,提问作者LoserEXE
相关产品推荐
相关产品推荐

