รายการพจนานุกรมของ Protobuf
ฉันกำลังพยายามกำหนดรายการพจนานุกรมใน. proto ของฉัน
ตัวอย่างทั้งหมดที่ฉันพบให้พจนานุกรมที่มีคีย์เดียวคู่ค่า:
message Pair {
string key = 1;
string value = 2;
}
message Dictionary {
repeated Pair pairs = 1;
}
หรือสิ่งที่ชอบ:
message Dictionary {
message Pair {
map<string, string> values = 1;
}
repeated Pair pairs = 1;
}
แต่ฉันจะจัดการกับพจนานุกรมคละประเภทที่ใหญ่กว่าได้อย่างไร
{
'k1': 1,
'k2': 2,
'k3': 'three',
'k4': [1,2,3]
}
เพื่อให้สิ่งต่างๆซับซ้อนขึ้นเมื่อฉันกำหนดพจนานุกรมของค่าผสมแล้วฉันต้องสร้างข้อความที่เป็นรายการของพจนานุกรมเหล่านี้ ฉันคิดว่ามันง่ายเหมือนกับการสร้างข้อความซ้ำอีกครั้งโดยมีพจนานุกรมซ้อนอยู่:
message DictList {
repeated Dictionary dlist = 1;
}
คำตอบ
แนวคิดบางประการที่ฉันคิดขึ้น:
- ดูเหมือนว่าควรจะเป็นไปได้ (หากคุณทราบประเภทค่าทั้งหมดล่วงหน้า) เพื่อใช้
oneof
สำหรับมูลค่า (https://developers.google.com/protocol-buffers/docs/proto3#oneof). ที่สามารถแก้ปัญหาได้เช่น
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;
}
คุณไม่สามารถใช้map
หรือrepeated
ภายในoneof
แม้ว่า
คุณสามารถใช้ฟิลด์ที่เป็นทางเลือกและกำหนดทั้งหมดเป็นค่าในนิยามข้อความ จากนั้นตั้งค่าเฉพาะที่คุณใช้จริง
คุณสามารถใช้ Wrapper หรือประเภทที่รู้จักเช่น
Value
:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value
แก้ไข
สำหรับValue
มันสามารถใช้เช่นนี้:
map<string, google.protobuf.Value> dict = 1;
- ใช้
struct
(ตามที่แนะนำโดย for_stack) สามารถดูได้ที่นี่: คุณสร้าง Protobuf Struct จาก Python Dict ได้อย่างไร