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.TRUE
或restaurant_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
添加到您的项目中
我检查了我服务器的 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.TRUE
或restaurant_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
添加到您的项目中