提问人:RKB 提问时间:10/27/2021 最后编辑:RKB 更新时间:11/2/2021 访问量:1517
如何将 Kotlin 对象数组转换为保留访问键名称的 json 数组?
How to convert an Kotlin array of objects into json array with preserving access key names?
问:
我有一个 API,它要求 json 请求采用特定的数组形式,其中数组对象字段使用名称访问,然后使用 Retrofit 发布。请参考以下代码:
科特林:
class RailPoint(
var railPointId,
var startTime,
var endTime
)
var rails: ArrayList<RailPoint>()
rails.add(RailPointObject1)
rails.add(RailPointObject2)
因此,将上述数组转换为 json 后,它应该产生以下结果:rails
{
"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数组形式呢?
答:
1赞
SadClown
10/27/2021
#1
这是一个丑陋的请求,您也许可以用一个丑陋的解决方案来解决它:)
我不建议将任何严肃的、大型的或任何需要一些艰苦和复杂维护的东西都这样做,但如果这个对象保持那么简单(一个 int 和两个字符串,不可为 null 的字段)并且不会发生太多变化,您可以手动执行:
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
(我假设时间是 s,但如果不是,只需在公式中添加一些日期格式)String
评论
0赞
RKB
10/27/2021
是的,这是我迄今为止见过的最丑陋的请求,出于某种原因我需要处理它。但幸运的是,请求对象不会有太大变化,并且会保持原样。感谢您的解决方案,我会试一试。
1赞
Marcono1234
11/2/2021
#2
这可以通过先让 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))
评论