Protobuf daftar kamus
Saya mencoba mendefinisikan daftar kamus di .proto saya
Semua contoh yang saya temukan menyediakan kamus dengan satu kunci, pasangan nilai:
message Pair {
string key = 1;
string value = 2;
}
message Dictionary {
repeated Pair pairs = 1;
}
atau sesuatu seperti:
message Dictionary {
message Pair {
map<string, string> values = 1;
}
repeated Pair pairs = 1;
}
tapi bagaimana saya menangani kamus yang lebih besar dari jenis campuran?
{
'k1': 1,
'k2': 2,
'k3': 'three',
'k4': [1,2,3]
}
Untuk lebih memperumit masalah, setelah saya mendefinisikan kamus nilai campuran, saya perlu membuat pesan yang merupakan daftar kamus ini. Saya berasumsi itu semudah membuat pesan berulang lainnya dengan kamus bersarang:
message DictList {
repeated Dictionary dlist = 1;
}
Jawaban
Beberapa ide yang saya dapatkan:
- Tampaknya itu memungkinkan (jika Anda mengetahui semua jenis nilai dimuka) untuk digunakan
oneof
untuk nilai (https://developers.google.com/protocol-buffers/docs/proto3#oneof). Itu bisa menyelesaikan masalah, mis
message Value {
oneof oneof_values {
string svalue = 1;
int ivalue = 2;
...
}
}
message Pair {
string key = 1;
Value value = 2;
}
message Dictionary {
repeated Pair pairs = 1;
}
Anda tidak dapat menggunakan map
atau repeated
di dalam oneof
sekalipun.
Anda dapat menggunakan kolom opsional dan menentukan semuanya sebagai nilai dalam definisi pesan. Kemudian atur hanya itu, yang benar-benar Anda gunakan.
Anda bisa menggunakan pembungkus, atau jenis yang dikenal, misalnya
Value
:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value
EDIT
untuk Value
itu, bisa digunakan seperti ini:
map<string, google.protobuf.Value> dict = 1;
- Gunakan
struct
(seperti yang disarankan oleh for_stack), bisa dilihat di sini: Bagaimana Anda membuat Protobuf Struct dari Python Dict?