Android Retrofit2 разбор логического значения всегда ложь

#android #json #postgresql #retrofit2

#Android #json #postgresql #модернизация 2

Вопрос:

Я проверил значение 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" },  

Когда дело доходит до моего клиента, это значение становится ложным

 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: MutableLiveDatalt;Listlt;Restaurantgt;gt; = MutableLiveData()  private val request = ServiceBuilder.ServiceBuilder.buildService(EndPointInterface::class.java)  private lateinit var call: Calllt;Listlt;Restaurantgt;gt;   fun getRestaurant(): LiveDatalt;Listlt;Restaurantgt;gt; {  return restaurants  }    fun setRestaurant(id: Int, daoType: Int) {  call = request.getRestaurants(id, daoType)   call.enqueue(object : Callbacklt;Listlt;Restaurantgt;gt; {  override fun onResponse(  call: Calllt;Listlt;Restaurantgt;gt;, response: Responselt;Listlt;Restaurantgt;gt;  ) {  if (response.isSuccessful) {  restaurants.postValue(response.body())  }  }  override fun onFailure(call: Calllt;Listlt;Restaurantgt;gt;, 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, )  

Комментарии:

1. Можете ли вы также поделиться классом данных ресторана?

2. Конечно, обновлено в вопросе

Ответ №1:

Это всегда ложно, потому что ваши данные "restaurant_isfav": "t", возвращают t неверное значение и возвращают его как строку, а не логическое значение, ваш код будет работать, если данные похожи "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.TRUE или restaurant_isfav.FALSE , но если вы хотите получить логическое значение, вы можете написать его так

 enum class Favourite(val boolValue: Boolean) {   @SerializedName("t")  TRUE(true),   @SerializedName("f")  FALSE(false), }  

И вы можете получить значение bool следующим образом restaurant_isfav.TRUE.boolValue

Не забудьте добавить com.squareup.retrofit2:converter-scalars в свой проект

Комментарии:

1. Спасибо, я изменил все логические значения на строковые как для базы данных, так и для клиента, это работает идеально.