Kotlin类将JSON与GSON构建器的嵌套对象匹配

时间:2019-01-21 17:49:45

标签: json kotlin gson

我有一些类似这样的传入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字符串中的嵌套对象创建其他类,但这也不起作用。

1 个答案:

答案 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来使班级不真实时才有意义。