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

如何使用com.google.gson将JsonArray中空字符串转为null并解决解析报错?

解决Gson解析空字符串转null及解析报错问题

兄弟,先给你揪出来报错的直接原因:你的JSON根节点是JsonObject(外层是{"Animals": [...]}),但你直接调用getAsJsonArray(),相当于把对象强行转成数组,这不报错才怪呢!先把解析的步骤修正,再处理空字符串转null的需求,分两种方案给你:

方案一:手动遍历处理(简单直接,适合临时场景)

先正确解析出Animals数组,再逐个遍历对象,把空字符串的Name字段替换成null:

String json = "{ \"Animals\": [ { \"id\": 6140, \"Name\": \"\" }, { \"id\": 6144, \"Name\": \"Lion\" } ] }";
JsonParser parser = new JsonParser();
// 先解析根对象,再拿到Animals对应的数组
JsonObject rootObj = parser.parse(json).getAsJsonObject();
JsonArray myarray = rootObj.getAsJsonArray("Animals");

// 遍历数组处理空字符串
for (JsonElement element : myarray) {
    JsonObject animalObj = element.getAsJsonObject();
    JsonElement nameElement = animalObj.get("Name");
    // 判断是否为空字符串,是的话替换成JsonNull(对应Java里的null)
    if (nameElement != null && nameElement.isJsonPrimitive() && nameElement.getAsString().isEmpty()) {
        animalObj.add("Name", JsonNull.INSTANCE);
    }
}

// 输出结果就是你想要的[{id=6140, Name=null},{id=6144, Name="Lion"}]
System.out.println(myarray);

方案二:自定义TypeAdapter(全局统一处理,更优雅)

如果你的项目里有很多这类空字符串转null的需求,推荐用Gson的自定义适配器,一次性搞定所有String类型字段的转换:

第一步:写自定义适配器

import com.google.gson.*;
import java.lang.reflect.Type;

public class EmptyStringToNullAdapter implements TypeAdapter<String> {
    @Override
    public void write(JsonWriter out, String value) throws IOException {
        // 序列化时,空字符串也转成null
        if (value == null || value.isEmpty()) {
            out.nullValue();
        } else {
            out.value(value);
        }
    }

    @Override
    public String read(JsonReader in) throws IOException {
        // 反序列化时,空字符串转成null
        String value = in.nextString();
        return value.isEmpty() ? null : value;
    }
}

第二步:注册适配器并解析

public static void main(String[] args) {
    String json = "{ \"Animals\": [ { \"id\": 6140, \"Name\": \"\" }, { \"id\": 6144, \"Name\": \"Lion\" } ] }";
    
    // 构建Gson实例时注册适配器
    Gson gson = new GsonBuilder()
            .registerTypeAdapter(String.class, new EmptyStringToNullAdapter())
            .create();
    
    // 解析根对象,获取Animals数组
    JsonObject rootObj = gson.fromJson(json, JsonObject.class);
    JsonArray myarray = rootObj.getAsJsonArray("Animals");
    
    System.out.println(myarray);

    // 额外说一句:如果你有对应的实体类(比如Animal类),直接映射更方便
    // List<Animal> animals = gson.fromJson(myarray, new TypeToken<List<Animal>>(){}.getType());
}

小提醒:如果你用的是Gson 2.8及以上版本,JsonParser已经被标记为过时了,更推荐用Gson.fromJson()的方式来解析,也就是方案二里的写法~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:49:00