Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin类将JSON与GSON builder的嵌套对象匹配_Json_Kotlin_Gson - Fatal编程技术网

Kotlin类将JSON与GSON builder的嵌套对象匹配

Kotlin类将JSON与GSON builder的嵌套对象匹配,json,kotlin,gson,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_a

我有一些传入的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\"}"
}
我正在尝试构造一个ServerParams Kotlin类,该类将与传入的JSON相匹配,这样我就可以像这样将该类传递给gsonBuilder:

val GSON = GsonBuilder().setLenient().create()
val server_params = GSON.fromJson(string, ServerParams::class.java)
我正在努力处理嵌套对象。我知道如何编写自己的反序列化程序,因此如果有必要,我可以这样做,但在我短暂的经验中,Kotlin已被证明是一种非常优雅的语言,因此我认为一定有更好的方法。我也不想为每个API调用编写匹配的反序列化程序


我尝试过内部类,但没有成功。我尝试过为JSON字符串中的嵌套对象创建其他类,但也没有成功。

下面是一个简单的示例:

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恢复课程时才有意义。

谢谢。通过你的例子真的帮助了我。对嵌套对象进行两次解析,将其转换为字符串,这是一个问题。我说的对吗?外部类中属性的名称必须与JSON中对象的名称匹配,这一点非常重要?@Tom很高兴它能帮助您!如果您的意思是
internal:{…
,对象的名称用JSON表示,那么这是正确的。因为JSON中没有定义顺序,所以名称对于大型映射至关重要。