如何将Kotlin对象数组转换为保留访问键名称的json数组?



我有一个API,它要求json请求以特定的数组形式,其中数组对象字段用名称访问,然后使用Retrofit发布。请参考以下代码:

芬兰湾的科特林:

class RailPoint(
var railPointId,
var startTime,
var endTime
)
var rails: ArrayList<RailPoint>()
rails.add(RailPointObject1)
rails.add(RailPointObject2)

因此,将上面的rails数组转换为json后,应该产生以下结果:

{
"railPoint[0][railPointId]": 5,
"railPoint[0][startTime]": "",
"railPoint[0][endTime]": "2021-10-19 07:37:19",
"railPoint[1][railPointId]": 1,
"railPoint[1][startTime]": "2021-10-19 07:33:37",
"railPoint[1][endTime]": "2021-10-19 07:35:20",
}

那么,我如何实现这种类型的json数组形式?

这是一个丑陋的请求,你也许可以用一个丑陋的解决方案来解决它:)

我不建议对任何严重的,大的,或者需要一些困难和复杂的维护的东西这样做,但是如果这个对象将保持那么简单(一个int和两个字符串,不可空字段)并且不会改变很多,你可以手工做:

class RailPoint(
var railPointId: Int,
var startTime: String,
var endTime: String
)
val rails = listOf(
RailPoint(1, "", "2021-10-19 07:37:19"),
RailPoint(2, "2021-10-19 07:33:37", "2021-10-19 07:35:20"),
)
fun toJson(rails: List<RailPoint>): String {
val sb = StringBuilder()

rails.forEachIndexed { index, railPoint ->
sb.append(""railPoint[$index][railPointId]": ${railPoint.railPointId},")
sb.append(""railPoint[$index][startTime]": "${railPoint.startTime}",")
sb.append(""railPoint[$index][endTime]": "${railPoint.endTime}",")
}
return "{ $sb }"
}

这是一个非常肮脏的方法,但可能足够了,只要你不使RailPoint更复杂,特别是,如果你不添加自定义类或集合的成员。

(我假设时间是Strings,但如果不是,只需在公式中添加一些日期格式)

这可以通过首先让Gson将列表序列化为JsonArray来解决,然后将元素组合到新的JsonObject中,然后将该对象序列化为JSON:

val rails: List<RailPoint> = ...
val gson = Gson()
val railsJsonList = gson.toJsonTree(rails).asJsonArray!!
val railsJsonObject = JsonObject()
// Transform elements
for (i in 0 until railsJsonList.size()) {
val railPointJson = railsJsonList[i].asJsonObject
for ((name, value) in railPointJson.entrySet()) {
railsJsonObject.add("railPoint[$i][$name]", value)
}
}
println(gson.toJson(railsJsonObject))

相关内容

  • 没有找到相关文章

最新更新