Peristiwa awan Unmarshal Firestore dalam format protojson ke dalam antara muka peta{} atau struct

WBOY
Lepaskan: 2024-02-13 23:09:08
ke hadapan
471 orang telah melayarinya

将 protojson 格式的 Firestore 云事件解组到 mapinterface{} 或结构中

Dalam artikel ini, editor PHP Zimo akan memperkenalkan cara menyahmarshal peristiwa awan Firestore dalam format protojson ke dalam peta[antara muka{}] atau struktur. Firestore ialah penyelesaian pangkalan data dokumen fleksibel yang disediakan oleh Google Cloud dan protojson ialah alat untuk menukar data Penampan Protokol kepada format JSON. Memahami cara menyahmarshalkan peristiwa awan Firestore ialah kemahiran penting untuk pembangun apabila menggunakan Pangkalan Data Firestore Artikel ini akan menerangkan secara terperinci langkah dan langkah berjaga-jaga untuk unmarshalling untuk membantu pembangun menggunakan fungsi Pangkalan Data Firestore dengan lebih baik.

Kandungan soalan

Adakah terdapat cara mudah untuk menyahmarshal firestore data dalam format protojson ke dalam peta[rentetan]antara muka{} atau struct tanpa menggunakan semua teg jenis data protobuf? iaitu meratakan data protojson.

Saya mempunyai fungsi awan google yang menyala apabila dokumen firebase baharu dibuat ("acara awan"). Acara awan ini mengandungi maklumat kontekstual, termasuk dokumen yang diubah suai dalam format protojson:

import (
    "google.golang.org/protobuf/encoding/protojson"
    "github.com/davecgh/go-spew/spew"
)

func cloudfunction(ctx context.context, e event.event) error {
    data := firestoredata.documenteventdata{}
    _ = protojson.unmarshal(e.dataencoded, &data);

    spew.dump(data)
}
Salin selepas log masuk
--------console output--------

{
"oldvalue": {},
"value": {
    "createtime": "2023-03-30t00:00:00.000000z",
    "updatetime": "2023-03-30t00:00:00.000000z",
    "name": "projects/myproject/databases/(default)/documents/collectionname/00000000-0000-0000-0000-000000000000",
    "fields": {
        "id": {
        "stringvalue": "00000000-0000-0000-0000-000000000000"
        },
        "action": {
            "stringvalue": "serverdosomething"
        },
        "payload": {
            "mapvalue": {
                "fields": {
                    "questionslist": {
                        "arrayvalue": {
                            "values": [
                                {
                                    "mapvalue": {
                                        "fields": {
                                            "title": {
                                                "stringvalue": "how do i fly a kite?"
                                            },
                                        }
                                    }
                                },
                                {
                                    "mapvalue": {
                                        "fields": {
                                            "title": {
                                            "stringvalue": "how do i fly a plane?"
                                            },
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
            }
        }
    }
},
"updatemask": {}
}
Salin selepas log masuk

Saya ingin menggabungkan sebahagian daripada dokumen protojson ini ke dalam struktur go tersuai untuk mengesahkan setiap jenis penyertaan dengan mudah, seperti ini:

// cloudeventrequest is a struct that wraps around one or more data validation structs contained in the payload
cloudeventrequest {
    id: "00000000-0000-0000-0000-000000000000"
    action: "serverdostuff"
    payload: map{
        "questionslist": []question{
            question{
                title: "how do i fly a kite?"
            },
            question{
                title: "how do i fly a plane?"
            }
        }
    }
}
Salin selepas log masuk

Sdk firestore termasuk kaedah datato yang memudahkan untuk menyahmarshal data berformat protojson ke dalam struktur tersuai. Saya cuba melakukan sesuatu yang hampir serupa, tetapi sudah mendapat data dokumen di luar sdk firestore.

// datato uses the document's fields to populate p, which can be a pointer to a map[string]interface{} or a pointer to a struct.

func (*firestore.documentsnapshot).datato(p interface{}) error
Salin selepas log masuk
import (
    "context"
    "cloud.google.com/go/firestore"
)

func FirestoreRead(docEvent firestoredata.DocumentEventData) error {
    ctx := context.Background()

    ref := h.client.Collection("mycollection").Doc(docEvent.value.ID)
    docSnapshot, err := tx.Get(ref)

    dataValidationStruct := CloudEventRequest{}
    err = docSnapshot.DataTo(&dataValidationStruct)
}
Salin selepas log masuk

Solution

Saya menulis pakej Go sumber terbuka yang dipanggil "firestruct" untuk menyelesaikan cabaran ini. Anda boleh menemuinya di sini: github.com/bennovw/firestruct Maklum balas dan sumbangan anda amat dialu-alukan!

Saya akhirnya menulis fungsi yang membongkar secara rekursif medan Firestore ke dalam peta yang sepadan. Saya kemudian memfaktorkan semula kaedah DataTo() dalam cloud.google.com/go/firestore untuk menyahmarshal peta saya menjadi struct.

Atas ialah kandungan terperinci Peristiwa awan Unmarshal Firestore dalam format protojson ke dalam antara muka peta{} atau struct. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan