รายการพจนานุกรมของ Protobuf

Aug 18 2020

ฉันกำลังพยายามกำหนดรายการพจนานุกรมใน. 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;
}

คำตอบ

1 dmaixner Aug 18 2020 at 17:22

แนวคิดบางประการที่ฉันคิดขึ้น:

  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แม้ว่า

  1. คุณสามารถใช้ฟิลด์ที่เป็นทางเลือกและกำหนดทั้งหมดเป็นค่าในนิยามข้อความ จากนั้นตั้งค่าเฉพาะที่คุณใช้จริง

  2. คุณสามารถใช้ Wrapper หรือประเภทที่รู้จักเช่นValue:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value

แก้ไข

สำหรับValueมันสามารถใช้เช่นนี้:

map<string, google.protobuf.Value> dict = 1;
  1. ใช้struct(ตามที่แนะนำโดย for_stack) สามารถดูได้ที่นี่: คุณสร้าง Protobuf Struct จาก Python Dict ได้อย่างไร