xpath-подобный запрос для сообщений protobuf

Я ищу язык запросов, похожий на xpath, для сообщений protobuf. Например, для показанного ниже сообщения Person [заимствовано из руководства разработчика]

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}

Я хотел бы иметь такие методы, как

XPBQuery.get(person, "$.id") ==> returns the id
XPBQuery.get(person, "$.name") ==> returns the name
XPBQuery.get(person, "$.phone.number[0]") ==> returns the first phone number

Один из способов — преобразовать прототип в Json и использовать API JsonPath/JsPath. Но каждый раз конвертировать в Json может быть дорого, особенно для больших объектов Proto.

Буду признателен за любую оказанную помощь.

Спасибо, Ирфан


person Irfan    schedule 13.02.2015    source источник
comment
Я не знаю, существует ли это уже, но если нет, вы можете реализовать это с точки зрения дескриптора Protobuf и интерфейсов отражения (не путать с отражением Java - отражение Protobuf предоставляется библиотекой Protobuf). См. com.google.protobuf.Message в Java или google::protobuf::Reflection в C++.   -  person Kenton Varda    schedule 15.02.2015
comment
@Irfan - Хотел проверить, нашел ли ты способ добиться этого? Я хочу отказаться от JSON.NET (поддерживающего JSONPath) и использовать ProtoBuf, но отсутствие возможности делать запросы останавливает меня.   -  person Lalman    schedule 05.06.2015
comment
Если вы преобразуете свое сообщение в java bean, вы можете использовать JXPath   -  person Konstantin Pavlov    schedule 28.06.2015


Ответы (2)


Поддержка этого появится в protobuf v3: https://github.com/google/protobuf/blob/4644f99d1af4250dec95339be6a13e149787ab33/src/google/protobuf/field_mask.proto

person Igor Gatis    schedule 29.07.2015

При поиске решения похожей проблемы обнаружил:

(Я не использовал эти библиотеки, так как мой целевой язык — C++, но надеюсь, что это может помочь кому-то еще)

Удачи!

person vlp    schedule 13.12.2017