如何使用 Klaxon 解析嵌套 JSON 并在 recyclerview 中显示?

Posted

技术标签:

【中文标题】如何使用 Klaxon 解析嵌套 JSON 并在 recyclerview 中显示?【英文标题】:How do I parse nested JSON using Klaxon and display in recyclerview? 【发布时间】:2019-02-02 13:49:18 【问题描述】:

这是我的 MainActivity.kt

class MainActivity : AppCompatActivity() 

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    var data = Klaxon()
            .parseArray<ProductData>(readArray())
    if(!data!!.isEmpty()) 
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.hasFixedSize()
        recyclerView.adapter = ListAdapter(data,  partItem : ProductData -> partItemClicked(partItem))
    


private fun partItemClicked(partItem : ProductData) 
    Toast.makeText(this, "You click $partItem.title", Toast.LENGTH_SHORT).show()

    val showDetailActivityIntent = Intent(this, DetailProduct::class.java)
    showDetailActivityIntent.putExtra(Intent.EXTRA_TEXT, partItem.title)
    startActivity(showDetailActivityIntent)


private fun readArray(): String 
    return application.assets.open("products.json").bufferedReader().use 
        it.readText()
    

这是我的适配器,ListAdapter.kt

class ListAdapter (var catalogList: List<ProductData>, var clickListener: (ProductData) -> Unit) :
    RecyclerView.Adapter<RecyclerView.ViewHolder>() 

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder 
    var v = LayoutInflater.from(parent.context).inflate(R.layout.product_catalog_list, parent, false)
    return ListHolder(v)


override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) 
    (holder as ListHolder).bind(catalogList[position], clickListener)


override fun getItemCount() = catalogList.size

class ListHolder(itemView: View) : RecyclerView.ViewHolder(itemView) 
    fun bind(_list: ProductData, clickListener: (ProductData) -> Unit) 
        itemView.nama_produk.text = _list.title
        itemView.deskripsi_produk.text = _list.snip
        itemView.harga.text = _list.calc.toString()
        itemView.setOnClickListener  clickListener(_list) 
    

我的 JSON 文件 products.json


    "snippets": [
      
        "title": "Huben Tarikan Laci Sabit TH-211",
        "snip": "Handle lemari atau laci dapat memudahkan penggunaan pada furniture rumah dengan ukuran yang bervariasi, desain&nbsp;..<br \/>",
        "calc": 0
      ,
      
        "title": "Huben Rak Piring Stainless RP + Ukuran",
        "snip": "Huben rak piring dengan bahan stainless berkualitas sangat awet dan tahan lama ideal untuk keperluan dapur anda Huben&nbsp;..<br \/>",
        "calc": 0
      ,
      
        "title": "Huben Tarikan Laci TA-24 ",
        "snip": "Tarikan laci huben berbahan stainless steel sangat awet dan tahan lama serta simple, gunakan tarikan ini sebagai&nbsp;..<br \/>",
        "calc": 0
      ,
      
        "title": "Yane A 910 Handle Laci Wooden \/ Tarikan Laci ",
        "snip": " Tarikan laci kayu tidak pernah kalah dengan bahan stainless karena mampu mempercantik tampilan laci atau lemari.&nbsp;..<br \/>",
        "calc": 0
      ,
      
        "title": "Yane B - I006C Kitchen Set \/ Rak Dapur ",
        "snip": " Ayo gunakan rak dapur kitchen set untuk menjaga kerapihan pada dapur Rak dapur minimalis sebagai tempat untuk&nbsp;..<br \/><span class=\"priOffi\">Rp 549.000<\/span><small class=\"unit\"> \/ item<\/small>",
        "calc": 0
      ,
      
        "title": "Yane AI 002 L Kitchen Set \/ Rak Dapur ",
        "snip": " Ayo beli dan gunakan rak dapur untuk menyimpan stok makanan agar rapi dan aman Rak dapur solusi untuk menyimpan barang&nbsp;..<br \/><span class=\"priOffi\">Rp 4.399.000<\/span><small class=\"unit\"> \/ item<\/small>",
        "calc": 0
      
      ]

我应该在我的klaxon()中做什么,来调用嵌套在“sn-ps”中的“title”?

数据类怎么样?我应该申报什么? 我不明白如何使用 recyclerview 显示调用嵌套 JSON 中的数据,尤其是使用 Klaxon。

【问题讨论】:

【参考方案1】:

您的数据类将是

data class ProductData(val snippets: List<SnippetsItem>?)
data class SnippetsItem(val snip: String = "",
                    val calc: Int = 0,
                    val title: String = "")

和解析器 json

val jsonFile= assets.open("myjson.json")

val result = Klaxon().parse<ProductData>(InputStreamReader(jsonFile))

val list = result?.snippets ?: emptyList()

这是列表。您将此列表发送到您的回收站视图适配器。修改你的适配器

class ListAdapter(var catalogList: List<SnippetsItem>, var clickListener: ClickListener)
: RecyclerView.Adapter<ListAdapter.ListHolder>() 


interface ClickListener 
    fun click(snip: SnippetsItem)


inner class ListHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
        View.OnClickListener 
    override fun onClick(v: View?) 
        val pos = adapterPosition
        clickListener.click(catalogList[pos])
    

    fun bind(snip: SnippetsItem) 
        //bind with view
        itemView.setOnClickListener(this)
    



现在是主要活动

class MainActivity : AppCompatActivity(),ListAdapter.ClickListener 



    override fun click(snip: SnippetsItem) 
        //do whatever you want
    

【讨论】:

1.类“ListAdapter”不是抽象的,也没有实现抽象基类成员@NonNull public abstract fun onCreateViewHolder(@NonNull p0: ViewGroup, p1: Int): ListAdapter.ListHolder 定义在 android.support.v7.widget.RecyclerView.Adapter 这个是错误,所以我在类前面添加了抽象。 2.从不使用变量“列表”。这是来自解析 json。我把它放在MainActivity.kt这个怎么样? 对不起,我今天很忙。你的问题解决了吗?您刚刚将这些方法添加到令人兴奋的方法中

以上是关于如何使用 Klaxon 解析嵌套 JSON 并在 recyclerview 中显示?的主要内容,如果未能解决你的问题,请参考以下文章

Android Kotlin + Klaxon - 解析 JSON 根数组

Klaxon 解析空枚举

如何将复杂(嵌套)对象解析为 JSON 并在 Flutter 中使用 HTTP 将其发送到服务器?

如何使用 Klaxon 从我的 JSON 文件中的两个数组中获取第一个图像 URL?

使用 Klaxon 序列化 JSON

Klaxon 解析 null