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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:46:42