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
相关产品推荐
相关产品推荐

