Firebase 云函数 - 对象不能用 JSON 编码 - Kotlin 数据类

Posted

技术标签:

【中文标题】Firebase 云函数 - 对象不能用 JSON 编码 - Kotlin 数据类【英文标题】:Firebase cloud functions - Object cannot be encoded in JSON - Kotlin data class 【发布时间】:2021-07-16 18:11:12 【问题描述】:

目前,我正在尝试在我的 android 应用程序中调用 https firebase 云函数。我得到的唯一问题是,当我尝试使用一些数据调用函数时,我得到了错误:

“对象不能用 JSON 编码”。

我的问题是:我该如何解决这个问题?我试图传递的对象是一个 kotlin 数据类。我必须先手动将数据转换为 json 对象(使用 gson)还是有更好的解决方案?

这是我目前的解决方案:(不工作,出现内部错误)

数据类

data class UserDeliveryAddress(
    val company: String? = "",
    val fullName: String = "",
    val postcode: Int = 0,
    val city: String = "",
    val street: String = "",
    val houseNumber: Int = 0,
    val country: String = "",
)

用法

if (optionalAdress != null) 
    val data = gson.toJson(userDeliveryNetworkEntityMapper.mapToEntity(optionalAdress))

    dbFunctions.getHttpsCallable("authOnCreate")
        .call(data) // just getting "internal" error
        .await()

云功能

export async function doOnAuthCreate(data: any, context: functions.https.CallableContext) 
    functions.logger.info("AUTH ON CREATE - Creating new user");

    const dataObject = JSON.parse(data);
    
    functions.logger.info(`Country is: $dataObject.country`);

    functions.logger.info("AUTH ON CREATE - Sucessfully created user");
    return 0;

索引.ts

import  doOnAuthCreate  from "./auth/onCreate.f"

export const authOnCreate = functions
    .region(region)
    .https
    .onCall(doOnAuthCreate);

【问题讨论】:

您是否尝试将 JSON 转换为 HashMap?我认为可调用函数接受 HashMaps 作为数据。 @TarikHuber 是的,我做到了,仍然是内部错误。我认为本地模拟器有问题。我创建了一个新的哈希图,但仍然无法正常工作。必须找到另一个解决方案 您可以在调用可调用函数之前尝试 JSONfy 数据吗? @FaridShumbar 没有改变任何东西 【参考方案1】:

好的,我已经设法解决了这个问题,这里是解决方案:

用法

optionalAdress?.let 
    val mappedAdress = userDeliveryNetworkEntityMapper.mapToEntity(it).asHashMap(gson = gson)

    dbFunctions.getHttpsCallable("authOnCreate")
        .call(mappedAdress)
        .await()

转换数据类

fun <T> T.asHashMap(gson: Gson): HashMap<String, Any> 
    return convert(gson)


private inline fun <I, reified O> I.convert(gson: Gson): O 
    val json = gson.toJson(this)
    return gson.fromJson(json, object : TypeToken<O>() .type)

云功能

export async function doOnAuthCreate(data: any) 
    functions.logger.info("AUTH ON CREATE - Creating new user");

    const company = data.company;
    functions.logger.info(`AUTH ON CREATE - Company is $company`)

    functions.logger.info("AUTH ON CREATE - Sucessfully created user");

index.ts

export const authOnCreate = functions
    .region(region)
    .https
    .onCall(doOnAuthCreate);

如果想将 https 函数与 firebase 函数模拟器结合使用,则必须将以下内容添加到 app.onCreate() 和清单中:

应用

class App : Application() 
   override fun onCreate() 
     initOnTest()
   


private fun initOnTest() 
    val fireStore = Firebase.firestore
    fireStore.useEmulator("10.0.2.2", 8080)

    val fireFunctions = Firebase.functions
    fireFunctions.useEmulator("10.0.2.2", 5001)

    val fireAuth = Firebase.auth
    fireAuth.useEmulator("10.0.2.2", 9099)

    val settings = FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build()

    fireStore.firestoreSettings = settings

清单(不要在生产中使用!!!!!)

<application
        android:usesCleartextTraffic="true"

【讨论】:

以上是关于Firebase 云函数 - 对象不能用 JSON 编码 - Kotlin 数据类的主要内容,如果未能解决你的问题,请参考以下文章

Firebase:将数据传递给 cloudfunction 导致:对象无法用 JSON 编码

错误:响应不是具有 onCall 的 firebase 函数上的有效 JSON 对象

Firebase 云函数对象可能“未定义”

Firebase 可调用云函数 CORS 错误

Firebase 函数,响应不是有效的 json 对象

如何在 Firebase 可调用云函数上引发错误?