Gson-具有空值的JsonObject

时间:2019-11-29 13:56:31

标签: json kotlin gson

我对Gson如何将字符串解析为JSON感到有些困惑。 一开始,我像这样初始化gson

val gson = Gson().newBuilder().serializeNulls().disableHtmlEscaping().create()

接下来,我将地图转换为字符串:

val pushJson = gson.toJson(data) // data is of type Map<String,Any>

给出以下输出:

{
    "name": null,
    "uuid": "5a8e8202-6654-44d9-a452-310773da78c1",
    "paymentCurrency": "EU"
}

此时,JSON字符串具有空值。但是在以下步骤中:

val jsonObject = JsonParser.parseString(pushJson).asJsonObject

还没有!

{
    "uuid": "5a8e8202-6654-44d9-a452-310773da78c1",
    "paymentCurrency": "EU"
}

省略空值。如何像在JSON字符串中那样在JsonObject中获取所有空值:

{
  "string-key": null,
  "other-key": null
}

@编辑

添加了一些json以帮助理解该问题。

1 个答案:

答案 0 :(得分:1)

与OP讨论之后,发现使用Retrotrofit将JSON对象序列化,以允许使用以下代码进行API调用:

return Retrofit.Builder()
    .baseUrl("api/url")
    .client(httpClient.build())
    .addConverterFactory(GsonConverterFactory.create())
    .build()
    .create(ApiInterface::class.java)

这里的问题在于GsonConverterFactory:由于没有Gson对象传递给create方法,因此在幕后创建了一个新的默认Gson实例,并且默认情况下,它不会序列化null值。

可以通过将适当的实例传递给工厂来轻松解决该问题:

val gson = GsonBuilder().serializeNulls().create() // plus any other custom configuration
....

fun createRetrofit() = Retrofit.Builder()
    .baseUrl("api/url")
    .client(httpClient.build())
    .addConverterFactory(GsonConverterFactory.create(gson)) // use the configured Gson instance
    .build()
    .create(ApiInterface::class.java)