Gson解析含null值JSON字符串为JsonObject时丢失null值,如何保留?
解决Gson解析JSON字符串为JsonObject时丢失null值的问题
你遇到的问题核心在于:你初始化的Gson实例配置了serializeNulls(),但这个配置只在序列化(toJson)时生效,而你用JsonParser.parseString()解析时,用的是Gson的默认配置——默认会忽略null值的键值对。
解决方案:用你配置好的Gson实例来解析
不要使用独立的JsonParser,而是直接用你已经开启serializeNulls()的Gson实例调用fromJson()方法来解析字符串为JsonObject,这样解析过程会沿用你的配置,保留所有null值。
修改后的代码示例:
// 保持你的Gson初始化不变 val gson = Gson().newBuilder() .serializeNulls() .disableHtmlEscaping() .create() // 假设你的data是这样的Map val data = mapOf( "name" to null, "uuid" to "5a8e8202-6654-44d9-a452-310773da78c1", "paymentCurrency" to "EU" ) // 序列化得到包含null的JSON字符串 val pushJson = gson.toJson(data) // 用配置好的gson实例解析,替代JsonParser val jsonObject = gson.fromJson(pushJson, JsonObject::class.java) // 此时jsonObject.toString()会输出: // {"name":null,"uuid":"5a8e8202-6654-44d9-a452-310773da78c1","paymentCurrency":"EU"}
为什么原来的方法不行?
JsonParser.parseString()是一个无状态的工具方法,它使用Gson的默认配置来解析,而默认配置中并没有开启serializeNulls(),所以解析时会自动丢弃值为null的键值对,导致你的JsonObject中丢失了name字段。
而你自己创建的Gson实例已经开启了serializeNulls(),这个配置不仅影响序列化(把null写入JSON字符串),也影响反序列化(解析JSON字符串时保留null值的键),所以用它来解析就能解决问题。
额外说明(如果你坚持用JsonParser)
如果你因为某些原因必须使用JsonParser(注意:Gson 2.8.6及之后版本中JsonParser已被标记为过时,官方推荐使用gson.fromJson),可以通过配置JsonReader来实现,但步骤更繁琐:
val reader = JsonReader(StringReader(pushJson)) val jsonElement = JsonParser.parseReader(reader) val jsonObject = jsonElement.asJsonObject // 不过这种方式依然依赖默认配置,可能无法稳定保留null值,所以更推荐第一种方法
内容的提问来源于stack exchange,提问作者shurrok
相关产品推荐
相关产品推荐

