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

How to convert an Kotlin array of objects into json array with preserving access key names?

提问人:RKB 提问时间:10/27/2021 最后编辑:RKB 更新时间:11/2/2021 访问量:1517

问:

我有一个 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数组形式呢?

Android JSON Kotlin gson 改造2

评论

0赞 Ivan Wooll 10/27/2021
你有问题吗?
0赞 RKB 10/27/2021
我的错,我以为主要问题标题就可以了。我已经编辑了我的问题描述。
1赞 terrorrussia-keeps-killing 10/27/2021
你在哪里找到这个病态的 API?😃

答:

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))