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 编码