解析含嵌套对象的JSON数组时Null条件校验失效问题
Gson解析含Null值的JSON数组时Null校验失效的解决方法
你的问题核心出在Gson对JSON Null值的特殊处理上:当JSON字段值为null时,JsonObject.get()返回的不是Java原生的null,而是JsonNull实例,所以你用==null、equals(null)这类判断完全不生效。另外代码里还有几处语法和逻辑错误,一起给你修正。
具体问题拆解
- 变量名错误:代码里的
finalIssueObj是笔误,应该是finalDataObj,否则直接编译报错。 - 无意义的重复解析:你把已经是
JsonElement的对象转成字符串再重新parse,既浪费性能,还会把JSON里的null转成字符串"null",导致后续的Null判断彻底失效。 - Null判断逻辑错误:Gson中判断JSON字段是否为Null,必须用
JsonElement.isJsonNull()方法,或者直接判断是否等于JsonNull.INSTANCE。
修正后的完整代码
import com.google.gson.*; public class DataParser { public static JsonArray parseData(JsonArray data) throws JsonParseException { JsonArray dataArray = new JsonArray(); for (JsonElement dataElement : data) { JsonObject obj = dataElement.getAsJsonObject(); JsonObject finalDataObj = new JsonObject(); JsonObject fieldsObj = obj.getAsJsonObject("fields"); finalDataObj.add("key", obj.get("key")); finalDataObj.addProperty("cityName", displayName(fieldsObj.get("cityName"))); finalDataObj.addProperty("category", displayName(fieldsObj.get("category"))); dataArray.add(finalDataObj); } return dataArray; } public static String displayName(JsonElement dataValue){ if (dataValue == null || dataValue.isJsonNull()){ return ""; } else { JsonObject obj = dataValue.getAsJsonObject(); // 如果name字段也可能为Null,这里可以再加一层判断 return obj.get("name").getAsString(); } } }
关键修改说明
- 直接用
JsonElement遍历输入数组,避免不必要的类型转换和重复解析操作。 - 通过
getAsJsonObject("fields")直接获取嵌套对象,不用转成字符串再二次解析。 displayName方法参数改为JsonElement,用isJsonNull()准确判断JSON中的Null值。- 用
getAsString()替代toString(),后者会返回带引号的字符串(比如"Hyderabad"),前者返回纯文本值,完全匹配你的期望输出。
测试验证
用你提供的输入JSON运行修正后的代码,会得到完全符合预期的输出:
[{"key":"1232","cityName":"Hyderabad","category":"Dining"},{"key":"1233","cityName":"","category":""}]
内容的提问来源于stack exchange,提问作者Siva_K22
相关产品推荐
相关产品推荐

