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.
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) }
--------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": {} }
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?" } } } }
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
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) }
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!