【问题标题】:Can't convert object of type java.lang.String to data class无法将 java.lang.String 类型的对象转换为数据类
【发布时间】:2021-06-09 16:48:22
【问题描述】:

我试图从 firebase 获取数据。我尝试了 2 种方法,第一种方法给了我无法将 java.lang.String 类型的对象转换为数据类错误。尽管数据快照具有值,但第二个返回 null。 第一种方法:

database.getReference("Customers").child(custID).get().addOnSuccessListener {
            it.children.forEach() {
                var cust = it.getValue(DataClassCustomer::class.java)//Error
                custName = cust?.firstName + " " + cust?.lastName
            }
        }

错误:

2021-03-12 00:25:39.634 28929-28929/com.example.goldenbeachhotelmanagementsystem E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.goldenbeachhotelmanagementsystem, PID: 28929
    com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.goldenbeachhoteldataclasses.DataClassCustomer
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)
        at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
        at com.example.goldenbeachhotelmanagementsystem.RoomManagement$readCustData$1.onSuccess(RoomManagement.kt:243)
        at com.example.goldenbeachhotelmanagementsystem.RoomManagement$readCustData$1.onSuccess(RoomManagement.kt:12)
        at com.google.android.gms.tasks.zzn.run(Unknown Source:4)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

这是数据类:

data class DataClassCustomer(
    var email: String? = "", var firstName:String? = "", var ic:String? = "", var lastName:String? ="", var phone:String?= ""){

}

第二种方法: 我尝试不使用循环,但 cust 值为 null

database.getReference("Customers").child(custID).get().addOnSuccessListener {
                var cust = it.getValue(DataClassCustomer::class.java)
                custName = cust?.firstName + " " + cust?.lastName
                println(custName)
        }

调试输出: enter image description here

Firebase 客户: enter image description here

【问题讨论】:

    标签: android firebase android-studio kotlin firebase-realtime-database


    【解决方案1】:

    您收到以下错误:

    com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.example.goldenbeachhoteldataclasses.DataClassCustomer 类型

    因为您试图将 String 对象转换为 DataClassCustomer 对象,这在 Java 中实际上是不可能的。发生这种情况是因为您使用的是以下参考:

    database.getReference("Customers").child(custID)
    

    指向 C0001 节点。使用 forEach() 循环时,您将获得该对象中的所有子对象,这些子对象实际上是字符串和 not "DataClassCustomer" 对象,因此会出现该错误。如果您想获取“客户”节点中存在的所有“DataClassCustomer”对象,只需删除对.child(custID) 的调用,您的代码就可以正常工作。如果要获取“email”、“firstName”、“ic”、“lastName”和“phone”的值,则替换以下行:

    var cust = it.getValue(DataClassCustomer::class.java)
    

    与:

    var cust = it.getValue(String::class.java)
    

    【讨论】:

      【解决方案2】:

      尝试使用Gson 库来解码客户值:

      database.getReference("Customers").child(custID).get().addOnSuccessListener {
          it.children.forEachIndexed() { index, element ->
              try {
                  val dataClassCustomerType = object : TypeToken<DataClassCustomer>() {}.type
                  val customerJson = element.value.getJSONObject(custID)
                  val cust = Gson().fromJson<DataClassCustomer>(customerJson, dataClassCustomerType)
                  val custData = cust.firstName + " " + cust.lastName
              } catch (e: Exception) {
                  e.printStackTrace()
              }
          }
      }
      

      【讨论】:

      • com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ >> 我在使用 gson 时遇到此错误。是因为 it.value 以 {firstName=Test, lastName=Chai, phone=0166832717, ic=990123-14-0265, email=test123@gmail.com} 这种格式返回?
      • 我认为这是因为 it.value 的第一个孩子是一个字符串而不是预期的对象。您可以尝试使用编辑后的代码并检查它是否引发异常?在这种情况下,您能否发布 stackTrace 结果?
      猜你喜欢
      • 1970-01-01
      • 2021-07-20
      • 2017-03-19
      • 2021-07-16
      • 2018-07-08
      • 1970-01-01
      • 2018-05-22
      • 2020-12-24
      • 2018-07-26
      相关资源
      最近更新 更多