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

Android中GSON解析JSON转实体类遇空值异常求助

解决Gson反序列化时Expected STRING but was NULL的异常

这个问题我之前也碰到过,本质是Gson在解析JSON时,发现someId字段是null,但当前的配置或实体类定义不允许String类型字段接受null值。下面给你几个可行的解决方案:

方案1:调整Gson实例为宽松模式

默认情况下Gson其实支持String字段接受null,但如果你的Gson实例被配置了严格检查,就会抛出这个异常。你可以创建一个宽松模式的Gson实例来解决:

// 创建宽松配置的Gson实例
Gson gson = new GsonBuilder()
        .setLenient() // 放宽JSON格式检查,同时允许null赋值给String字段
        .create();

// 使用这个实例进行反序列化
MyClass result = gson.fromJson(ResourceUtils.getStringFromInputStream(inputStream), MyClass.class);

方案2:检查实体类的非空注解

看看你的A类中someId字段有没有添加@NonNull(比如AndroidX的androidx.annotation.NonNull)这类注解。如果有,直接去掉它——因为JSON里的null值和注解要求的"非空"冲突了,Gson会因此抛出异常:

class A {
    // 去掉@NonNull注解
    public String someId;
    public String e;
}

方案3:自定义TypeAdapter处理String类型的null值

如果上面的方法都不适用,你可以写一个自定义的TypeAdapter,明确告诉Gson如何处理String类型的null值:

public class StringNullAdapter extends TypeAdapter<String> {
    @Override
    public void write(JsonWriter out, String value) throws IOException {
        out.value(value);
    }

    @Override
    public String read(JsonReader in) throws IOException {
        // 遇到null时直接返回null,而不是抛出异常
        if (in.peek() == JsonToken.NULL) {
            in.nextNull();
            return null;
        }
        return in.nextString();
    }
}

然后注册这个适配器到Gson实例中:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(String.class, new StringNullAdapter())
        .create();

方案4:用Optional包装可空字段(Java 8+)

如果你的项目使用Java 8及以上版本,可以用Optional<String>来明确表示someId是可空字段,Gson会自动处理null值:

class A {
    public Optional<String> someId;
    public String e;
}

解析后,如果JSON里someId是null,对应的字段会变成Optional.empty(),避免类型冲突。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:09:17