如何使用方括号加载 JSON 数据

Posted

技术标签:

【中文标题】如何使用方括号加载 JSON 数据【英文标题】:How to load JSON data with square bracket 【发布时间】:2021-09-19 07:51:20 【问题描述】:

我正在从 Breaking bad API https://www.breakingbadapi.com/api/character/random 调用数据 我无法获取数据。我认为这是因为主响应文件有方括号,我需要先调用它。但我不知道怎么称呼它。我能得到一些帮助吗?

这是我的 API 接口

interface APIRequest 

    @GET("character/random")

    suspend fun getInfo() : Response<List<ResponseBB>>

ResponseBB 类

data class ResponseBB(

    @field:SerializedName("ResponseBB")
    val responseBB: List<ResponseBBItem?>? = null
)

    data class ResponseBBItem(
    
            @field:SerializedName("birthday")
            val birthday: Any? = null,
        
            @field:SerializedName("img")
            val img: String? = null,
        
            @field:SerializedName("better_call_saul_appearance")
            val betterCallSaulAppearance: Any? = null,
        
            @field:SerializedName("occupation")
            val occupation: List<String?>? = null,
        
            @field:SerializedName("appearance")
            val appearance: List<Int?>? = null,
        
            @field:SerializedName("portrayed")
            val portrayed: String? = null,
        
            @field:SerializedName("name")
            val name: String? = null,
        
            @field:SerializedName("nickname")
            val nickname: String? = null,
        
            @field:SerializedName("char_id")
            val charId: Int? = null,
        
            @field:SerializedName("category")
            val category: String? = null,
        
            @field:SerializedName("status")
            val status: String? = null
        )

客户对象

object Client 

    val gson = GsonBuilder().create()
    val retrofit = Retrofit.Builder()
        .baseUrl("https://www.breakingbadapi.com/api/")
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()

    val  api = retrofit.create(APIRequest::class.java)

这是我在主要活动中调用结果的函数

class MainActivity : AppCompatActivity() 

    private var TAG = "MainActivity"
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        getCharacterInfo()

        linearLayout.setOnClickListener 
            getCharacterInfo()
        
    

    private fun getCharacterInfo() 
        GlobalScope.launch(Dispatchers.IO) 
            try 
                val response = Client.api.getInfo()
                if (response.isSuccessful) 
                    val data = response.body()
                    Log.d(TAG, data.toString())
                    withContext(Dispatchers.Main) 
                        Picasso.get().load(data!!.img).into(ivImage)
                        tvName.text = data.name
                        tvOccupation.text = data.toString()
                        tvActor.text = data.toString()
                        tvAppearance.text = data.appearance.toString()
                        tvStatus.text = data.status
                    
                
            
            catch (e:Exception)
                withContext(Dispatchers.Main)
                    Toast.makeText(applicationContext, "Cannot Load Data" , Toast.LENGTH_LONG).show()
                
            
        
    

【问题讨论】:

【参考方案1】:

我看到你尝试在改造中使用协程,我建议你不要使用 Response,将其改为调用并移除挂起。

interface APIRequest 

    @GET("character/random")

    fun getInfo() : Call<List<ResponseBB>>

在您的全局范围内,您可以这样称呼它:

GlobalScope.launch 
    try
       val response = Client.api.getInfo().await()
    catch(e:Exception)

你可以在改造和gson Converter中使用2.9.0版本

【讨论】:

以上是关于如何使用方括号加载 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

JSON数据格式中,中括号里的数据如何转换成JSON格式

如何使用 JSON 数据数组加载 extjs 3.4 存储

如何从 JSON 数组数据输出中删除大括号 []?

如何使用 AngularJS 从其他域(无回调函数)加载 JSON 数据对象

如何使用 http get 从本地 Json 文件加载数据?

在括号内加载包含 JSON 的 JSON 文件