Я делаю вызов gRPC на сервер, используя отражение, которое возвращает динамическое сообщение в качестве ответного сообщения. Теперь, хотя этот объект похож на вложенный объект, его структура немного отличается от JSON. Это делает выборку значений на основе полей, таких как
someObject.get(someField)
трудный. Один из способов — преобразовать это сообщение в объект, а затем получить нужные значения. Любые предложения по разбору здесь?
Это возвращаемый класс:
com.google.protobuf.DynamicMessage
Но, хотя это выглядит как вложенный JSON, мы не можем получать значения на основе полей.
Чтобы иметь общее представление о схеме, вот как выглядит ответ:
field1 {
key1: "value1"
}
field2 {
key1: "value1"
key2: value2
key3 {
netsed_key_1: "nested_val_1"
netsed_key_2: "nested_val_2"
}
key4 {
netsed_key_1: "nested_val_1"
netsed_key_2: "nested_val_2"
}
}




Попробуй это:
FieldDescriptor fieldDescriptor = message.getDescriptorForType().findFieldByName("someField");
Object value = message.getField(fieldDescriptor);
Чтобы получить список всех полей:
Map<Descriptors.FieldDescriptor, Object> allFields = message.getAllFields();
Чтобы получить вложенное значение, сделайте следующее:
Message subMessage =
(Message)message.getField(
message.getDescriptorForType().findFieldByName("field3"));
Message subSubMessage =
(Message)subMessage.getField(
subMessage.getDescriptorForType().findFieldByName("key3"));
String subSubSubMessage veryNestedString =
(String)subSubMessage.getField(
subSubMessage.getDescriptorForType().findFieldByName("netsed_key_1"));
Привет, Джон, спасибо за ответ. Я добавил образец схемы в основной вопрос, чтобы мы могли получить представление о схеме, на которую мы ссылаемся. message.getAllFields() просто возвращает поля первого уровня, а не вложенные поля, есть ли какие-либо предложения, как мы собираемся ссылаться на них. Кроме того, message.getDescriptorForType().findFieldByName("someField"); дает нулевой указатель, так как карта имеет ключи в формате FieldDesriptor, а здесь мы даем строку.
Привет, Джон, я обновил комментарий и вопрос, не могли бы вы поделиться еще немного света?
Я смог разрешить NPE, но все еще не смог получить значения на основе вложенных ключей.
Я получаю сообщение об ошибке неизменяемого списка при приведении типа к Message: Failed to read message., причина = java.lang.ClassCastException: java.util.Collections$UnmodifiedRandomAccessList не может быть приведен к com.google.protobuf.Message
В режиме отладки, без приведения, можете ли вы проверить типы элементов в UnmodifiedRandomAccessList?
Если поле, к которому вы обращаетесь, является повторяющимся полем, вам нужно будет использовать message.getRepeatedField вместо message.getField. Это относится к field3?
Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.