首页 > 解决方案 > Android Kotlin - JSON 对象的总和

问题描述

我有两个使用外键/字段连接的 JSON 文件(在我的情况下,一个是 Post(id,...)和 Comments(postId,...))。我需要显示每个帖子的评论总数(在我的情况下它总是 5)。

我的数据类如下:

data class Posts(val userId: Int,
                 val id: Int,
                 val title: String,
                 val body: String)

data class Comments(val postId: Int,
                    val id: Int,
                    val name: String,
                    val email: String,
                    val body: String) 

这是我用来获取 json 数据的函数(我使用 okhttp 设置客户端,使用 gson 获取数据):

private fun fetchCommentJson() {
        val postId = intent.getIntExtra(POST_ID, -1)
        val commentJsonData = commentsJSON

        val client = OkHttpClient()

        val request = Request.Builder().url(commentJsonData).build()
        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call?, e: IOException?) {
                toast("Something went wrong fetching your data")
            }

            override fun onResponse(call: Call?, response: Response?) {
                val body = response?.body()?.string()
                val gson = GsonBuilder().create()
                val commentsDetail = gson.fromJson(body, Array<Comments>::class.java)
                val postDetail = gson.fromJson(body, Array<Posts>::class.java)

                runOnUiThread {

                    for (commentSizeList in 0 until commentsDetail.size) {

                        val listOfComments = commentsDetail[commentSizeList] // List of all comments by Index
                        val post = postDetail[postId - 1].id // Post Id

                        // If postId is equal to original post id
                        if (listOfComments.postId == post) {
                            // Print it out
                            println(listOfComments)
                        }
                    }
                }
            }
        })
    }

当我打印出列表时,它确实会根据它的 ID 打印出每个特定帖子的所有评论(因为它已经完成了比较)。但是,它会分别打印出每条评论(并且设置 listOfComments.size 会为每条评论打印出 1)。

显示每个帖子的所有评论列表

我的问题是如何将它们全部结合起来,以便显示每个帖子的评论总数(在这种情况下 - > 5)?

标签: androidkotlingson

解决方案


如果我正确理解您的需求,您可以使用以下代码替换整个 for 循环filter

// Post Id, the way you've been calculating it
val post = postDetail[postId - 1].id 

// a list of comments only containing the ones that have the ID you need
val filteredComments: List<Comments> = commentsDetail.filter { it.postId == post } 

从这里,您可以打印整个列表:

println(filteredComments)

或列表的大小:

println(filteredComments.size)

推荐阅读