如何使用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
相关产品推荐
相关产品推荐

