在 Android/Kotlin 上使用 GSON 解析空值
Null values parsing with GSON on Android/Kotlin
我正在尝试使用 GSON 在 Android/Kotlin 应用程序中解析 to/from JSON。当我 运行 这段代码 foobar 和 jsonString 都是空的。我错过了什么?
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"))
...
}
}
我正在尝试使用 GSON 在 Android/Kotlin 应用程序中解析 to/from JSON。当我 运行 这段代码 foobar 和 jsonString 都是空的。我错过了什么?
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"))
...
}
}