在 Android/Kotlin 上使用 GSON 解析空值

Null values parsing with GSON on Android/Kotlin

我正在尝试使用 GSON 在 Android/Kotlin 应用程序中解析 to/from JSON。当我 运行 这段代码 foobarjsonString 都是空的。我错过了什么?

    var gson = Gson()

    data class Foobar( val foo: String )

    val foobar = gson.fromJson("""{"foo":"bar"}""",Foobar::class.java)
    val jsonString = gson.toJson(Foobar("bar"))

利用基本单元测试:

class ExampleUnitTest {

    @Test
    fun fooTest() {

        var gson = Gson()

        data class Foobar( val foo: String )

        val foobar = gson.fromJson("""{"foo":"bar"}""",Foobar::class.java)
        val jsonString = gson.toJson(Foobar("bar"))

        assertEquals(null, foobar)
        assertEquals(null, jsonString)
    }
}

此测试失败:

Expected :null<null> 
Actual   :java.lang.String<null>

将 class 移到方法之外:

data class Foobar( val foo: String )

@Test
fun fooTest() {

    var gson = Gson()


    val foobar = gson.fromJson("""{"foo":"bar"}""",Foobar::class.java)
    val jsonString = gson.toJson(Foobar("bar"))

    assertEquals(null, foobar)
    assertEquals(null, jsonString)
}

Expected :null
Actual   :Foobar(foo=bar)

以及

Expected :null
Actual   :{"foo":"bar"}

这是一件好事,这意味着我们期望它为空,但测试失败了,因为我们的变量实际上有值。您的问题是由方法中的数据 class 引起的,在您的情况下,此方法是 onCreate,将其移出可解决问题

因为这段代码全部在Androidclass(MainActivity的onCreate()方法中), Foobar::class.java 没有考虑 Foobar class 嵌套在 MainActivity class 中。所以,这也是一个修复:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {

        ...
        
        var gson = Gson()

        data class Foobar( val foo: String )

        val foobar = gson.fromJson(
                     """{"foo":"bar"}""",
                     MainActivity.Foobar::class.java)

        val jsonString = gson.toJson(Foobar("bar"))

        ...
    }
}