You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取可传入GSON解析器的正确JSON对象?Kotlin解析报错求助

解决Gson解析时的Expected BEGIN_OBJECT but was STRING错误

嘿,这个错误我太熟了!本质上是你用Gson解析的JSON数据格式和你定义的Kotlin数据类(或者预期的解析类型)不匹配——Gson期待解析一个对象(也就是{...}这种键值对结构),但实际拿到的是一个纯字符串(比如"https://example.com/image.jpg")。下面给你一步步排查和解决的思路:

  • 先确认真实的JSON内容
    别光靠预期,先把你获取到的原始JSON字符串打印出来看看,比如用Log输出:

    Log.d("Debug_JSON", "原始JSON内容: $jsonString")
    

    你大概率会发现,拿到的不是你预想的{"imageUrl": "xxx"}这种对象结构,而是一个直接的图片URL字符串。

  • 调整解析逻辑匹配数据格式
    如果确实返回的是纯图片URL字符串,那完全不需要用自定义数据类去解析,直接把JSON转成String就行:

    val imageUrl = Gson().fromJson(jsonString, String::class.java)
    

    拿到URL后,就可以用图片加载库(比如Glide或者Coil)把图片显示到ImageView了,举个Glide的例子:

    Glide.with(this)
        .load(imageUrl)
        .placeholder(R.drawable.placeholder) // 可选:加载中的占位图
        .error(R.drawable.error) // 可选:加载失败的占位图
        .into(yourImageView)
    
  • 如果预期是对象但数据源返回错误
    要是你本来就应该拿到对象结构的JSON,但接口返回了纯字符串,有两种处理方式:

    1. 联系后端同事调整接口返回格式,让它符合{"imageUrl": "xxx"}的对象结构;
    2. 自己在客户端把纯字符串包装成对象格式的JSON再解析,比如:
      // 把纯字符串包装成符合数据类的JSON结构
      val wrappedJson = "{\"imageUrl\": \"$jsonString\"}"
      // 假设你的数据类是这样的
      data class ImageData(val imageUrl: String)
      val imageData = Gson().fromJson(wrappedJson, ImageData::class.java)
      
  • 额外小提醒
    解析前一定要做非空校验,避免空字符串或者null导致的其他异常:

    if (!jsonString.isNullOrBlank()) {
        // 执行上面的解析和图片加载逻辑
    } else {
        // 处理空数据的情况,比如显示默认图
        yourImageView.setImageResource(R.drawable.default_image)
    }
    

内容的提问来源于stack exchange,提问作者mchd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:05:10