У меня есть сообщение с полем общеизвестного типа «Любой», которое может содержать сериализованное сообщение protobuf любого типа.
Я хочу преобразовать это поле в его представление json.
Я знаю, что требуются имена полей, и обычно вам нужно, чтобы сгенерированные классы были загружены в приложение, чтобы это работало, но я ищу способ сделать это с дескрипторами.
Сначала я разбираю дескрипторы:
FileInputStream descriptorFile = new FileInputStream("/descriptor");
DescriptorProtos.FileDescriptorSet fdp = DescriptorProtos.FileDescriptorSet.parseFrom(descriptorFile);
Затем переберите все содержащиеся в сообщении сообщения и найдите правильное (используя URL-адрес типа «Любой», содержащий пакет и имя сообщения. Я добавляю его в TypeRegistry, который используется для форматирования JSON.
JsonFormat.TypeRegistry.Builder typeRegistryBuilder = JsonFormat.TypeRegistry.newBuilder();
String messageNameFromUrl = member.getAny().getTypeUrl().split("/")[1];
for (DescriptorProtos.FileDescriptorProto file : fdp.getFileList()) {
for (DescriptorProtos.DescriptorProto dp : file.getMessageTypeList()) {
if (messageNameFromUrl.equals(String.format("%s.%s", file.getPackage(), dp.getName()))) {
typeRegistryBuilder.add(dp.getDescriptorForType()); //Doesn't work.
typeRegistryBuilder.add(MyConcreteGeneratedClass.getDescriptor()); //Works
System.out.println(JsonFormat.printer().usingTypeRegistry(typeRegistryBuilder.build()).preservingProtoFieldNames().print(member.getAny()));
return;
}
}
}
Кажется, проблема в том, что синтаксический анализ дескриптора дает мне доступ к Descriptors.DescriptorProto
объектам, но я не вижу способа получить объект Descriptors.Descriptor
, необходимый для реестра типов. Я могу получить доступ к дескриптору конкретного класса с помощью getDescriptor (), и это работает, но я пытаюсь отформатировать JSON во время выполнения, получая доступ к предварительно сгенерированному файлу дескриптора из-за пределов приложения, и поэтому у меня нет этого конкретного класса, доступного для вызова getDescriptor()
Что было бы еще лучше, если бы я мог использовать URL-адрес типа поля «Любое», чтобы разрешить объект Type
, и использовать его для генерации JSON, поскольку он также имеет номера и имена полей, необходимые для этого. процесс.
Любая помощь приветствуется, спасибо!