我有一些类似这样的传入JSON。
{ "status":200,
"transformation_percent":0.0,
"image_percent":24.51,
"bandwidth_percent":0.0,
"storage_percent":26.23,
"freeTrialPeriod":7889238000,
"freeTrialParams":"{\"cache_period\":604800000,\"cache_allowance\":5000,\"price_in_cents\":0}",
"basicPlanParams":"{\"cache_period\":604800000,\"cache_allowance\":10000,\"stripe_plan_id\":\"plan_blah\",\"price_in_cents\":100,\"currency\":\"eur\"}"
}
我正在尝试构造一个与传入的JSON匹配的ServerParams Kotlin类,以便可以像这样将类传递给gsonBuilder:
val GSON = GsonBuilder().setLenient().create()
val server_params = GSON.fromJson(string, ServerParams::class.java)
我正在处理嵌套对象。我知道如何编写自己的反序列化程序,因此我可以根据需要进行操作,但是根据我的短时间经验,Kotlin被证明是一种优雅的语言,因此我认为必须有一种更好的方法。我也不想为每个API调用编写匹配的反序列化器!
我尝试了内部类,但是没有用。我曾尝试为JSON字符串中的嵌套对象创建其他类,但这也不起作用。
答案 0 :(得分:1)
以下是如何操作的最小示例:
class OuterClass(val name: String) {
var inner = InnerClass(2)
}
class InnerClass(val number: Int)
fun main() {
val gson = GsonBuilder().setLenient().create()
val outerClass = gson.fromJson("""{
name: 'test',
inner: {
number : 1
}
}""".trimMargin(), OuterClass::class.java)
}
您只需将内部类的实例放在外部类的属性中即可。
由于Gson通过反射对类进行了更改,因此您还可以将内部类声明为lateninit
,这将使使用默认值的内部类的实例化变得不必要。
class OuterClass(val name: String) {
lateinit var inner: InnerClass
}
这当然只有在您仅通过Gson来使班级不真实时才有意义。