I've been struggling with passing a JSON with Message values back and forth between systems. Got a bit further, but I'm still not there. A Struct seems to be the way but even though the struct I'm sending looks perfectly fine, it is empty once received by the server.
Result
is passed from a web browser (grpc-web) to a Python backend. The Python backend should serialize Result
to JSON (to store it) and back again.
// proto
message Result {
google.protobuf.Struct variables = 1;
}
// obj - Where variables would contain a (1 level deep) JSON with different types of values, e.g.:
{
"key1": 1,
"key2": true,
"key3": proto_msg_a //instance of proto.MessageA
}
// code
struct = new proto.google.protobuf.Struct(obj);
req = new Request;
req.variables = struct;
Checking req.variables
before sending shows that it's indeed a Struct
with all the correct fields in it. But once the other end (server) receives it req.variables
is an empty Struct
. For testing purposes I tried an obj
that is simply {'key': 'value'}
, but the result was the same.
So then I tried proto.google.protobuf.Struct.fromJavaScript
:
// code
struct = proto.google.protobuf.Struct.fromJavaScript(vars);
req = new Request;
req.variables = struct;
This works for a simple obj
(e.g. {"key": "val"}
), but for an obj
with a proto message field (such as above) it resulted in :
struct_pb.js:875 Uncaught Error: Unexpected struct type.
at Function.proto.google.protobuf.Value.fromJavaScript (struct_pb.js:875)
at Function.proto.google.protobuf.Struct.fromJavaScript (struct_pb.js:941)
at Function.proto.google.protobuf.Value.fromJavaScript (struct_pb.js:871)
at Function.proto.google.protobuf.Struct.fromJavaScript (struct_pb.js:941)
at Function.proto.google.protobuf.Value.fromJavaScript (struct_pb.js:871)
at Function.proto.google.protobuf.Struct.fromJavaScript (struct_pb.js:941)
at Function.proto.google.protobuf.Value.fromJavaScript (struct_pb.js:871)
at Function.proto.google.protobuf.Struct.fromJavaScript (struct_pb.js:941)
Or can I, instead of going through all the troubles with protobuf/json in javascript, just use a map
?
// proto
message Request {
map<string, ?type?> variables = 1;
}
But what would ?type?
then be if it the values can ben anything (proto.MessageX, string, boolean, etc)?
I would really like to use proto messages in variables. The reason for picking protobuf/grpc was exactly this, being able to use the same type throughout our complete platform, but this seems to be blocking this goal. Did I miss something? What would you do?