Как я могу преобразовать Firebase HttpsCallableResult в Объект, используя классы данных Android и Kotlin? - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь добавить регистрацию пользователя в свое приложение для Android. Когда пользователь создается, система сначала регистрирует его с помощью firebase, а в случае успеха сохраняет копию в базе данных.

Вот так выглядят мои функции https.onCall:

export const reg = https.onCall((data, context) =>
admin.auth().createUser({
    uid: data.uid,
    email: data.email,
    emailVerified: false,
    phoneNumber: data.phone,
    password: data.phone.substr(-8),
    displayName: data.name,
    photoURL: "http://www.example.com/default.png",
    disabled: false
}).then(user => claims.set(user.uid, data.role)).catch(error => ({ok: false, error})));

Когда я делаю запрос, используя код из Документов, например:

private fun addUser(name: String, email: String, phone: String, role: String): Task<String> {
// Create the arguments to the callable function.
val data = hashMapOf(
    "name" to name,
    "email" to email,
    "phone" to phone,
    "role" to role
)

return functions
        .getHttpsCallable("reg")
        .call(data)
        .continueWith { task ->
            val result = task.result?.data as String
            Log.d("HttpsCallableResult", result)
            result
        }

}

Я получаю

{ok=false, error={codePrefix=auth, errorInfo={code=auth/uid-already-exists, message=The user with the provided uid already exists.}}}

Итак, используя класс данных Gson и kotlin, у меня есть

object Reg {
  data class Result(val ok: Boolean, val role: String)
  data class Err(val codePrefix: String)
  data class ErrorInfo(val code: String, val message: String)
}

и теперь, когда я регистрирую результат, используя

val json = Gson().fromJson(res, Reg.Result::class.java)
Log.d("HttpsCallableResult", json)

Я получаю это исключение:

2019-01-07 10:44:51.641 13165-13165/com.modenu.tp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.modenu.tp, PID: 13165
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 57 path $.error..
    at com.google.gson.Gson.fromJson(Gson.java:942)
    at com.google.gson.Gson.fromJson(Gson.java:892)
    at com.google.gson.Gson.fromJson(Gson.java:841)
    at com.google.gson.Gson.fromJson(Gson.java:813)
    at com.modenu.tp.ui.account.admin.AdminActivity$addUser$1.onComplete(AdminActivity.kt:138)
    at com.google.android.gms.tasks.zzj.run(Unknown Source:4)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 57 path $.error..
    at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1568)
    at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:491)
    at com.google.gson.stream.JsonReader.skipValue(JsonReader.java:1232)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
    at com.google.gson.Gson.fromJson(Gson.java:927)
    at com.google.gson.Gson.fromJson(Gson.java:892) 
    at com.google.gson.Gson.fromJson(Gson.java:841) 
    at com.google.gson.Gson.fromJson(Gson.java:813) 
    at com.modenu.tp.ui.account.admin.AdminActivity$addUser$1.onComplete(AdminActivity.kt:138) 
    at com.google.android.gms.tasks.zzj.run(Unknown Source:4) 
    at android.os.Handler.handleCallback(Handler.java:873) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.app.ActivityThread.main(ActivityThread.java:6669) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

Здесь я использую Gson, но любое работающее решение будет оценено.

...