Android Retrofit2 解析布尔值总是false

Android Retrofit2 parsing boolean value always false

我检查了我服务器的 HTTP 响应值,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 实现了一个简单的网络服务器,数据库是 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,
)

它总是错误的,因为你的数据 "restaurant_isfav": "t", return t 不是真的并且 return 它是字符串而不是布尔值,如果数据像 "restaurant_isfav": true,

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

另一种解决方案是枚举,将 t 映射为 TRUE,将 f 映射为 FALSE

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

    @SerializedName("f")
    FALSE,
}

而在餐厅 class 中,您将拥有

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 添加到您的项目中