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

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();
}

几个优化方向及优化后代码:

  1. 用增强for循环替代索引循环:避免索引操作冗余,代码更简洁,同时降低索引越界风险
  2. 提取重复的数组写入逻辑:把嵌套的extra数组写入逻辑抽成独立方法,减少代码重复
  3. 增加集合非空判断:避免集合为null时触发空指针异常,提升代码健壮性
  4. 链式调用简化代码:将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:00:37