不支持解码(“DocumentID 值只能使用 Firestore.Decoder 进行解码”)

问题描述 投票:0回答:3

我有以下

struct

struct Recipe: Codable {
    @DocumentID var id: String?
    var vegetarian: Bool?
}

这就是我解析 Firestore 数据的方式:

do {
    let decoder = JSONDecoder()
    let recipeToDisplay = try decoder.decode(Recipe.self, from: data!)
                    
    let uuid = UUID().uuidString
                    
    FirestoreService.createRecipe(
        documentId: uuid,
        vegetarian: recipeToDisplay.vegetarian ?? false
    ) { recipeURL in
        print("success")
    }
} catch {
    print("Error parsing response data: \(error)")
}

正在调用

catch
语句,我收到以下错误消息:
decodingIsNotSupported("DocumentID values can only be decoded with Firestore.Decoder")

我研究过的所有文档都指出我使用

JSONDecoder()
来解析数据,但我在
Firestore.Decoder
上找不到任何内容。我应该有不同的方式来解析数据吗?

ios json swift firebase google-cloud-firestore
3个回答
4
投票

问题是我试图从没有

id
属性的源中解码
id
。从我的
id
中排除
CodingKeys
解决了问题。

struct Recipe: Codable {
    @DocumentID var id: String?
    var vegetarian: Bool?
    
    private enum CodingKeys: String, CodingKey {
        case id
        case vegetarian
    }
}

0
投票

我的问题是我没有使用显式的可编码实现。不幸的是,您必须添加所有无意义的样板才能使其工作。而不是使用默认值。

所以继续让你的模型膨胀:

enum CodingKeys:字符串,CodingKey

init(来自解码器:解码器)

func 编码(到编码器:编码器)


0
投票

Firebase 现在带有自己的解码器,您不再需要使用 JSON 解码器。您可以将文档引用传递给解码器来解析文档 ID。这样您就不需要 CodingKeys 来使其工作。

struct Recipe: Codable {
    @DocumentID var id: String?
    var vegetarian: Bool?
}

这就是你如何使用它

do {

    let documentRef = Firestore.firestore().collection("recipes")
    let decoder = Firestore.Decoder()
    let recipeToDisplay = try decoder.decode(Recipe.self, from: data!)
                

} catch {
    print("Error parsing response data: \(error)")
}
© www.soinside.com 2019 - 2024. All rights reserved.