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

vshtjzan  于 2022-11-06  发布在  Android
关注(0)|答案(2)|浏览(239)

我正在使用GSON在Android/Kotlin应用中解析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"))
gfttwv5a

gfttwv5a1#

使用基本单元测试:

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>

将类移到方法之外:

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"}

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

7lrncoxx

7lrncoxx2#

由于这些代码都在Android类(Main Activity)的 onCreate() 方法中,*Foobar::class.java * 没有考虑到 Foobar 类嵌套在 MainActivity 类中这一事实。因此,这也是一个修复:

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"))

        ...
    }
}

相关问题