从Python JSON迁移到Kotlin JVM JSON
我有一些使用导入json和使用 方法读取json并在易于使用的可访问字典中以代码形式呈现它 我使用python json[name][]=值构造来引用内存中的json数据,还使用相同类型的语法将新值分配给json元素 我想将Python代码迁移到Kotlin,并寻找JSON库,这些库的功能类似于Python JSON.load在Kotlin中的功能 我确实使用了Google,但没有找到任何东西,有很多Kotlin/JavaJSON库,但我认为它们没有提供任何类似Python JSON加载方法的功能 我的最佳选择库是什么 下面是Python代码的详细信息,我想在Kotlin中也这样做,并使用现有的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加载方法的功
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)
}