从Python JSON迁移到Kotlin JVM JSON

从Python JSON迁移到Kotlin JVM JSON,python,json,kotlin,kotlinx.serialization,Python,Json,Kotlin,Kotlinx.serialization,我有一些使用导入json和使用 方法读取json并在易于使用的可访问字典中以代码形式呈现它 我使用python json[name][]=值构造来引用内存中的json数据,还使用相同类型的语法将新值分配给json元素 我想将Python代码迁移到Kotlin,并寻找JSON库,这些库的功能类似于Python JSON.load在Kotlin中的功能 我确实使用了Google,但没有找到任何东西,有很多Kotlin/JavaJSON库,但我认为它们没有提供任何类似Python JSON加载方法的功

我有一些使用导入json和使用

方法读取json并在易于使用的可访问字典中以代码形式呈现它

我使用python json[name][]=值构造来引用内存中的json数据,还使用相同类型的语法将新值分配给json元素

我想将Python代码迁移到Kotlin,并寻找JSON库,这些库的功能类似于Python JSON.load在Kotlin中的功能

我确实使用了Google,但没有找到任何东西,有很多Kotlin/JavaJSON库,但我认为它们没有提供任何类似Python JSON加载方法的功能

我的最佳选择库是什么

下面是Python代码的详细信息,我想在Kotlin中也这样做,并使用现有的JSON库

import json 
js = json.loads(response['Body'].read())
js文件的内容如下: 下面是Python如何使用[]和range访问上述json文档 我希望这能澄清我将Python代码迁移到Kotlin的目的。

您可以使用Json.plain.parseJson。。。从Kotlins序列化框架得到类似的东西。它将创建一个Json对象树,然后可以像地图一样导航

import kotlinx.serialization.json.Json
import kotlinx.serialization.json.content
import java.lang.StringBuilder

fun main() {

    val js = Json.plain.parseJson(data).jsonObject

    println(js["repartitionLoadType"]?.content)
    // ...

    var partitionDts = StringBuilder()

    for (repartitionTargetColumn in js["repartitionTargetColumnList"]!!.jsonArray) {
        if (repartitionTargetColumn.jsonObject["isDatePartition"]?.primitive?.boolean!!) {
            partitionDts.append("`" + repartitionTargetColumn.jsonObject["colName"] + "`");
        }
        else {
            // JsonObjects are immutable in Kotlin
            // repartitionTargetColumn.jsonObject["colName"] = "new value replace/assign here"
        }
    }

}
确保在项目设置中包含Kotlin序列化插件。请参阅Github项目,了解如何做到这一点

由于Kotlin是一种静态类型的语言,您可能应该为Json文件定义一个数据类,并将该文件解析为该数据类的对象,而不是使用上面的非类型化方法

import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json

@Serializable
data class BodyData(
    var environment: String,
    var repartitionLoadType: String
    // ...
)

fun main() {
    val bodyData = Json.nonstrict.parse(BodyData.serializer(), data)
    println(bodyData.repartitionLoadType)
}

也许这就是你要找的:如果上面的链接不能满足你的需要,请说明load提供了什么,但您在kotlin上没有找到类似的内容。您可以在kotlin中使用Gson库。请参阅我的原始帖子-我编辑了内容并提供了示例python json代码,以了解如何使用现有json库在kotlin中执行相同的操作。谢谢。这是:val bodyData=Json.nonstrict.parseBodyData.serializer,数据-未编译,序列化程序错误:未解析引用:序列化程序。但是如果我像这样使用泛型:val r=Json.nonstrict.parserepartitionJsonConfig//那么它就可以工作了。我正在使用最新的Kotlin 1.3.31和2019年3月的最新Json库。谢谢。未解析引用:序列化程序与Gradle一起工作。奇怪的是,这是IntelliJ的一个已知问题。Json.nonstrict.parserepartitionJsonConfig使用反射来获取正确的序列化程序。这对于Java来说很好,但在JS中可能会有问题
    print (js["repartitionLoadType"])
    print (js['configBucket'], js['configFileName'], js['HighWaterMarkFileName'])
    print (js['repartitionTargetTableName'], js['repartitionTargetS3Location'])
    print (js['repartitionSourceTableName'], js['repartitionSourceDbName'])
    print (js['repartitionTargetDbName'], js['repartitionLoadType'])
    print (js['autoCreateCountry'], js['autoCreateTenant'], js['missingPartColDataValReplace'])
    print (js['countryCodeColName'], js['tenantColName'], js['propagateGlueJobRunGuid'])
    print (js['countryCodeDefault'], js['tenantDefault'], js['validateIncomingCountryTenant'], js['repartition'])

    partition_dts = ""
    # json array
    for i in range(0, len(js['repartitionTargetColumnList'])):
        if True == js['repartitionTargetColumnList'][i]['isDatePartition']:
            partition_dts = "`" + js['repartitionTargetColumnList'][i]['colName'] + "`"
        else:
            js['repartitionTargetColumnList'][i]['colName'] = "new value replace/assign here"
        continue

# to set/replace/assign any values above:
    js["repartitionLoadType"] = "some new value"
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.content
import java.lang.StringBuilder

fun main() {

    val js = Json.plain.parseJson(data).jsonObject

    println(js["repartitionLoadType"]?.content)
    // ...

    var partitionDts = StringBuilder()

    for (repartitionTargetColumn in js["repartitionTargetColumnList"]!!.jsonArray) {
        if (repartitionTargetColumn.jsonObject["isDatePartition"]?.primitive?.boolean!!) {
            partitionDts.append("`" + repartitionTargetColumn.jsonObject["colName"] + "`");
        }
        else {
            // JsonObjects are immutable in Kotlin
            // repartitionTargetColumn.jsonObject["colName"] = "new value replace/assign here"
        }
    }

}
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json

@Serializable
data class BodyData(
    var environment: String,
    var repartitionLoadType: String
    // ...
)

fun main() {
    val bodyData = Json.nonstrict.parse(BodyData.serializer(), data)
    println(bodyData.repartitionLoadType)
}