Написание прото-файла для ввода JSON, содержащего случайные имена полей

Новичок в protobuff здесь. Я работаю над сжатием файла JSON с помощью protobuff. Проблема в том, что этот файл JSON приходит как ответ от веб-сервера и содержит определенные поля, имена которых являются случайными, т.е. с каждым запросом, отправленным на сервер, имена ключей различаются. Например, рассмотрим приведенный ниже JSON:

{
  "field1": [
       {
           "abc": "vala",
           "def": "valb",
           "ghi": "valc"
       }
   ],
  "field2": "val2",
  "field3": "val3"
}

В приведенном выше json имена полей «abc», «def», «ghi» могут каждый раз меняться. Есть ли способ в protobuf, чтобы я полностью получил значение поля1 (например, одну строку или что-то еще) без потери случайных полей внутри него?


person PanDroid    schedule 16.08.2018    source источник


Ответы (1)


Я думаю, вы хотите "struct.proto", т.е.

syntax = "proto3";
import "google/protobuf/struct.proto";
message Foo {
     .google.protobuf.Struct field1 = 1;
     string field2 = 2;
     string field3 = 3;
}

или, возможно (из-за массива):

syntax = "proto3";
import "google/protobuf/struct.proto";
message Foo {
     repeated .google.protobuf.Struct field1 = 1;
     string field2 = 2;
     string field3 = 3;
}

Однако я должен подчеркнуть, что protobuf плохо подходит для разбора произвольного json; для этого вы должны использовать библиотеку json, а не библиотеку protobuf.

person Marc Gravell    schedule 16.08.2018
comment
Эй, спасибо за ваш ответ ... но это не работает для меня. Разве структура не использует внутреннюю карту, для которой необходимо присутствие полей ключа и значения? Я искал способ сохранить неизвестные поля в сериализации в proto2 или proto3. Не могли бы вы рассказать мне что-нибудь об этом? Это может быть большим подспорьем. - person PanDroid; 17.08.2018