【问题标题】:Android Retrofit2 parsing boolean value always falseAndroid Retrofit2解析布尔值总是假
【发布时间】:2022-01-16 01:19:29
【问题描述】:

我检查了我服务器的 HTTP Response 值,restaurant_isfav 的值是 t(rue)

{
    "restaurant_average": "9",
    "restaurant_isfav": "t",
    "restaurant_id": "2",
    "restaurant_address": "89 Rue Queen, QC J1M 1J5",
    "restaurant_genre": "Fast Food",
    "restaurant_lat": "45.3654632370656",
    "restaurant_tel": "+18198237007",
    "restaurant_name": "Tim Hortons",
    "restaurant_long": "-71.85717677305372"
},

当涉及到我的客户时,该值变为 false

Restaurant (
    restaurant_id=2, 
    restaurant_name=Tim Hortons,
    restaurant_address=89 Rue Queen, QC J1M 1J5,
    restaurant_genre=Fast Food,
    restaurant_average=9.0,
    restaurant_tel=+18198237007, restaurant_lat=45.365463,
    restaurant_long=-71.85718,
    restaurant_isfav=false
)

我用Java实现了一个简单的Web服务器,数据库是Postgresql

这里是相关代码:Gradle

implementation 'com.google.code.gson:gson:2.8.7'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

ViewModel

class HomeViewModel : ViewModel() {
    private val restaurants: MutableLiveData<List<Restaurant>> = MutableLiveData()
    private val request = ServiceBuilder.ServiceBuilder.buildService(EndPointInterface::class.java)
    private lateinit var call: Call<List<Restaurant>>

    fun getRestaurant(): LiveData<List<Restaurant>> {
        return restaurants
    }
    
    fun setRestaurant(id: Int, daoType: Int) {
        call = request.getRestaurants(id, daoType)

        call.enqueue(object : Callback<List<Restaurant>> {
            override fun onResponse(
                call: Call<List<Restaurant>>, response: Response<List<Restaurant>>
            ) {
                if (response.isSuccessful) {
                    restaurants.postValue(response.body())
                }
            }
            override fun onFailure(call: Call<List<Restaurant>>, t: Throwable) {
                t.stackTrace
            }
        })
        
    }
}

Restaurant

data class Restaurant (
    val restaurant_id: Int,
    val restaurant_name: String,
    val restaurant_address: String,
    val restaurant_genre: String,
    val restaurant_average: Float,
    val restaurant_tel: String,
    val restaurant_lat: Float,
    val restaurant_long: Float,
    var restaurant_isfav: Boolean,
)

【问题讨论】:

  • 你能分享一下餐厅数据类吗?
  • 当然,已在问题中更新

标签: android json postgresql retrofit2


【解决方案1】:

它总是错误的,因为您的数据 "restaurant_isfav": "t", 返回 t 不是 true 并将其作为字符串而不是布尔值返回,如果数据类似于 "restaurant_isfav": true,,您的代码将起作用

要解决这个问题,您可以将restaurant_isfav 类型从布尔型转换为字符串,然后检查它是t 还是f

另一种解决方案是将t 映射到TRUE 并将f 映射到FALSE 的枚举

enum class Favourite {
    @SerializedName("t")
    TRUE,

    @SerializedName("f")
    FALSE,
}

在餐厅课上你会有

var restaurant_isfav: Favourite,

当你检查时你会写restaurant_isfav.TRUErestaurant_isfav.FALSE,但是如果你想得到布尔值你可以这样写

enum class Favourite(val boolValue: Boolean) {

    @SerializedName("t")
    TRUE(true),

    @SerializedName("f")
    FALSE(false),
}

你可以像restaurant_isfav.TRUE.boolValue这样得到布尔值

不要忘记将com.squareup.retrofit2:converter-scalars 添加到您的项目中

【讨论】:

  • 谢谢,我将数据库和客户端的所有布尔值都更改为字符串,效果很好。
猜你喜欢
  • 2016-10-09
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多